Créer un jeton d'accès à la messagerie Firebase
P粉178132828
P粉178132828 2023-12-29 13:01:24
0
1
421

Je peux envoyer des notifications via Firebase Messaging en utilisant la requête CURL ci-dessous. J'utilise actuellement le terrain de jeu OAuth 2.0 pour obtenir des jetons d'accès. Je dois implémenter un script PHP pour ce faire. Comment générer un jeton d'accès par programme en PHP ?

curl -X POST -k -H 'Authorization: Bearer access_token_goes_here' -H 'Content-Type: application/json' -i 'https://fcm.googleapis.com/v1/projects/projectId/messages:send' --data '{
  "message":{
    "topic" : "newTopic",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

P粉178132828
P粉178132828

répondre à tous(1)
P粉713866425

J'ai trouvé beaucoup de solutions, mais elles nécessitent toutes beaucoup de bibliothèques et de dépendances.

Je construis ma propre solution sans dépendances supplémentaires. Voici l'API pour obtenir les jetons OAuth2 : https://developers.google.com/identity/protocols/oauth2/service-account#httprest

La première étape consiste à créer un JWT (Json Web Token). En utilisant ce JWT, un jeton de porteur peut être demandé.

// php doesn't have build-in support for base64UrlEncoded strings, so I added one myself
function base64UrlEncode($text)
{
    return str_replace(
        ['+', '/', '='],
        ['-', '_', ''],
        base64_encode($text)
    );
}

// Read service account details
$authConfigString = file_get_contents("path_to_the_json_file_jou_downloaded_from_firebase_console.json");

// Parse service account details
$authConfig = json_decode($authConfigString);

// Read private key from service account details
$secret = openssl_get_privatekey($authConfig->private_key);

// Create the token header
$header = json_encode([
    'typ' => 'JWT',
    'alg' => 'RS256'
]);

// Get seconds since 1 January 1970
$time = time();

// Allow 1 minute time deviation
$start = $time - 60;
$end = $time + 3600;

$payload = json_encode([
    "iss" => $authConfig->client_email,
    "scope" => "https://www.googleapis.com/auth/firebase.messaging",
    "aud" => "https://oauth2.googleapis.com/token",
    "exp" => $end,
    "iat" => $start
]);

// Encode Header
$base64UrlHeader = base64UrlEncode($header);

// Encode Payload
$base64UrlPayload = base64UrlEncode($payload);

// Create Signature Hash
$result = openssl_sign($base64UrlHeader . "." . $base64UrlPayload, $signature, $secret, OPENSSL_ALGO_SHA256);

// Encode Signature to Base64Url String
$base64UrlSignature = base64UrlEncode($signature);

// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;

//-----Request token------
$options = array('http' => array(
    'method'  => 'POST',
    'content' => 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion='.$jwt,
    'header'  =>
        "Content-Type: application/x-www-form-urlencoded"
));
$context  = stream_context_create($options);
$responseText = file_get_contents("https://oauth2.googleapis.com/token", false, $context);

$response = json_decode($responseText);

$response Contient des jetons au porteur. Vous devez stocker ce jeton pour l'utiliser par d'autres demandes et demander un nouveau jeton de porteur lorsqu'il est sur le point d'expirer. La durée de vie maximale de ce jeton au porteur est de 1 heure.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal