聊天机器人:如何验证来自谷歌环聊的传入请求

mrw*_*eld 5 validation bearer-token hangouts-api hangouts-chat

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

谷歌客户端 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');

}

Run Code Online (Sandbox Code Playgroud)

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

mrw*_*eld 1

我在另一个SO问题的帮助下找到了一个可接受的解决方案。谷歌客户端库已经导入了 firebase/php-jwt,所以我按照我链接到的问题中的 Jed 的思路进行操作。从令牌中提取 KID,我用它来识别此 url 中的正确公钥。然后我实例化了 php-jwt 库并调用它的解码方法,传递所需的参数。解码方法还会验证签名并在成功时返回 JWT 的组件。