为了将HTTP V1 API
(而不是遗留的API)与PHP一起使用,必须使用REST接口。
https://firebase.google.com/docs/cloud-messaging/send-message#top_of_page
我想知道如何获取身份验证 2.0 访问令牌?
https://firebase.google.com/docs/cloud-messaging/auth-server
由于 PHP 没有Google API Client Library
(请参阅上面链接中的示例),如何通过 REST 调用接收 Auth 2.0 令牌(无需显示 PHP 代码)?
相关问题:一旦收到这个短暂的代币,如何刷新这个代币?工作流程是什么?
多谢!
如果要在没有外部库的情况下手动获取访问令牌,则可以使用此代码。它使用私钥创建 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_token
、expires_in
和token_type
。
您应该将令牌存储在某个地方以备将来使用,并在令牌过期时根据expires_in
请求新令牌。(1小时后)。
您还可以请求生存期较短的令牌,但令牌的最长生存期为 1 小时。
实际上有一种用于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 存储库的自述文件中,您可以找到有关如何获取 OAuth 访问和刷新令牌的说明。
这两个库都与下面的Guzzle一起工作,并提供了一种使用授权中间件装饰您自己的Guzzle HTTP客户端的方法,这样您就不必这样做了。
因此,如果其中一个库不支持您要访问的 API,您可以应用以下代码片段中的代码并自己访问有问题的 API(来自 Google API PHP 客户端 - "直接发出 HTTP 请求"):
// 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();
无耻的插件:我正在维护一个单独的管理 SDK,用于访问 https://github.com/kreait/firebase-php 的 Firebase 相关 API,它有一个 FCM 组件,记录在此处:https://firebase-php.readthedocs.io/en/stable/cloud-messaging.html