/
memoryspeak
/
MemoryspeakServer
Обзор
Документация
Войти
/
memoryspeak
/
MemoryspeakServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
functions.php
152 строки
4 KB
funxplay
create struct by get notes
10 дек 2025, 05:39
10 дек 2025, 05:39
50a90e4
Код
Авторство
О чём код?
<?php require_once 'libs/jwt/Key.php'; require_once 'libs/jwt/JWT.php'; use Firebase\JWT\JWT; use Firebase\JWT\Key; function sendFirebaseNotificationAboutNewNote($fcmToken, $data) { $accessToken = getAccessToken(); if (!$accessToken) return ['success' => false, 'error' => 'Failed to get access token']; $message = [ 'message' => [ 'token' => $fcmToken, 'notification' => [ 'title' => $data['title'], 'body' => $data['body'] ], 'data' => [ 'memoryspeak_notification_type' => 'memoryspeak_share_note', 'memoryspeak_notification_shared_token' => $data['token'], 'memoryspeak_notification_sender' => $data['sender'] ] ] ]; $url = "https://fcm.googleapis.com/v1/projects/".GOOGLE_SERVICES_PROJECT_ID."/messages:send"; $headers = [ 'Authorization: Bearer ' . $accessToken, 'Content-Type: application/json' ]; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode($message), CURLOPT_TIMEOUT => 10 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return [ 'success' => $httpCode === 200, 'http_code' => $httpCode, 'response' => json_decode($response, true) ]; } function getAccessToken() { $header = json_encode(['alg' => 'RS256', 'typ' => 'JWT']); $payload = json_encode([ 'iss' => GOOGLE_SERVICES_CLIENT_EMAIL, 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', 'aud' => 'https://oauth2.googleapis.com/token', 'exp' => time() + 3600, 'iat' => time() ]); $base64Header = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header)); $base64Payload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); $signature = ''; openssl_sign("$base64Header.$base64Payload", $signature, GOOGLE_SERVICES_PRIVATE_KEY, 'SHA256'); $base64Signature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature)); $jwt = "$base64Header.$base64Payload.$base64Signature"; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://oauth2.googleapis.com/token', CURLOPT_POST => true, CURLOPT_POSTFIELDS => "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$jwt", CURLOPT_RETURNTRANSFER => true ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); return $data['access_token'] ?? null; } function extractJWT($authHeader){ if (preg_match('/Bearer\s+(.*)$/i', $authHeader, $matches)) { return $matches[1]; } return ''; } function verifyJWT($jwt, $secret){ try { $decoded = JWT::decode($jwt, new Key($secret, 'HS256')); return (array) $decoded; } catch(Exception $e) { return null; } } function createJWT($userId, $username, $secret) { $payload = [ 'iss' => 'https://memoryspeak.ru', 'aud' => 'https://memoryspeak.ru/api', 'iat' => time(), 'exp' => time() + (60 * 60 * 24 * 30), // 30 дней 'user_id' => $userId, 'username' => $username ]; return JWT::encode($payload, $secret, 'HS256'); } function createRefreshToken() { return bin2hex(random_bytes(32)); } function getAuthenticatedUser($jwt, $jwt_secret, $db_connect) { $payload = verifyJWT($jwt, $jwt_secret); if ($payload) { $db_get_user = $db_connect-> prepare("SELECT id, username FROM users WHERE id = :user_id;"); $db_get_user->execute(['user_id' => $payload['user_id']]); $user = $db_get_user->fetch(PDO::FETCH_ASSOC); $db_get_user-> closeCursor(); if (!$user) { return [ 'http_response_code' => 401, 'user_id' => 0, 'username' => '', 'exception' => 'User not found' ]; } else { return [ 'http_response_code' => 200, 'user_id' => $user['id'], 'username' => $user['username'], 'exception' => '' ]; } } else { return [ 'http_response_code' => 401, 'user_id' => 0, 'username' => '', 'exception' => 'Invalid or expired token' ]; } } ?>