Maison  >  Questions et réponses  >  le corps du texte

Créer un jeton d'accès à la messagerie Firebase

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粉178132828P粉178132828318 Il y a quelques jours380

répondre à tous(1)je répondrai

  • P粉713866425

    P粉7138664252023-12-30 00:15:32

    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.

    répondre
    0
  • Annulerrépondre