5

我们整合了一个 google hangouts 聊天机器人,为我们的团队提供一些方便的功能。该机器人属于“机器人 URL”类型,这意味着环聊将请求发送到应用端点,我们的应用会做出适当的响应。目前,我们正在努力验证来自谷歌的传入请求。每个请求的 Authentication 标头中都有一个不记名令牌,但该 JWT 令牌不会验证。php 客户端库 [ https://github.com/googleapis/google-api-php-client]和在线验证器 [ https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=]返回错误“无效签名”

google 客户端 php 库的 Google_AccessToken_Verify 类有一个 verifyIdToken 方法,我们在此示例 [ https://github.com/GoogleCloudPlatform/php-docs-samples/blob/master/auth/src/auth_cloud_explicit.php]中描述了该方法。我们将服务帐户密钥文件的路径和项目 ID 传递给 google 客户端构造函数。然后我们将传入请求的承载令牌传递给 verifyIdToken 方法。

use Google_Client;

// inside a laravel controller with $request in scope

$bearer_token = $request->bearerToken();
$keyPath = FILE_LOCATION

$client = new Google_Client([
               'keyFilePath' => $keyPath,
               'projectId' => GCP_CLIENT_ID
           ]);

$payload = $client->verifyIdToken($bearer_token);

if(!empty($payload)){

    return $this->call(ParseGoogleChatRequest::class, [$request]);

}else{

     \Log::debug('bad token');

}

我希望谷歌客户端库能够验证谷歌 JWT。这个 github 问题 [ https://github.com/firebase/php-jwt/issues/175]反映了我们实施这种方法的经验。我想获得一些关于我们应该使用哪种方法的一般指导。

4

1 回答 1

1

在另一个 SO question的帮助下,我找到了一个可以接受的解决方案。谷歌客户端库已经在导入 firebase/php-jwt,所以我从我链接到的问题中遵循了与 Jed 相同的路线。从令牌中提取 KID,我用它从这个 url中识别正确的公钥。然后我实例化了 php-jwt 库并在其上调用 decode 方法,传递所需的参数。decode 方法还验证签名并在成功时返回 JWT 的组件。

于 2019-07-12T17:12:34.790 回答