Firebase云消息传送HTTP V1 API:如何通过REST调用获取Auth 2.0访问令牌?

flseospp  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(263)

为了在PHP中使用HTTP V1 API(不是遗留API),必须使用REST接口。
https://firebase.google.com/docs/cloud-messaging/send-message#top_of_page
我想知道如何获得Auth 2.0访问令牌?
https://firebase.google.com/docs/cloud-messaging/auth-server
由于PHP没有Google API Client Library(参见上面链接中的示例),如何通过REST调用接收Auth 2.0令牌(无需显示PHP代码)?
相关问题:一旦收到这个短命的令牌,如何刷新这个令牌?2工作流程是什么?
多谢了!

rsl1atfo

rsl1atfo1#

实际上有一种针对PHP的"Google Api客户端库",甚至有两种:
https://github.com/google/google-api-php-client
以及
https://github.com/GoogleCloudPlatform/google-cloud-php
一个提供对API的访问,而另一个不提供,因此值得查看哪个提供什么-您可能需要同时使用它们。
https://github.com/google/google-api-php-client存储库的README中,您可以找到关于如何获取OAuth访问和刷新令牌的描述。
这两个库都在底层使用Guzzle,并提供了一种使用授权中间件来装饰您自己的Guzzle HTTP客户机的方法,这样您就不必这么做了。
因此,如果其中一个库不支持您想要访问的API,您可以应用下面代码片段中的代码,自己访问相关API(从Google Api PHP客户端-"Making HTTP requests directly"):

// create the Google client
$client = new Google_Client();

/**
 * Set your method for authentication. Depending on the API, This could be
 * directly with an access token, API key, or (recommended) using
 * Application Default Credentials.
 */
$client->useApplicationDefaultCredentials();

// returns a Guzzle HTTP Client
$httpClient = $client->authorize();

无耻插:我在https://github.com/kreait/firebase-php上维护一个单独的Admin SDK,用于访问与Firebase相关的API,它有一个FCM组件,文档如下:https://firebase-php.readthedocs.io/en/stable/cloud-messaging.html

du7egjpx

du7egjpx2#

如果您想手动获得访问令牌,而不使用外部库,可以使用以下代码:它使用您的私钥创建一个JWT令牌,并请求一个承载者令牌。

function base64UrlEncode($text)
{
    return str_replace(
        ['+', '/', '='],
        ['-', '_', ''],
        base64_encode($text)
    );
}

// Read service account details
$authConfigString = file_get_contents("path_to_your_private_key_file_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();

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

// 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);

响应包含3个字段:access_tokenexpires_intoken_type

相关问题