node.js - 从 Google Chat POST 请求验证 JWT
问题描述
我在 NodeJS 中有一个使用 HTTPs 端点连接到 Google Chat 的机器人。我正在使用快递接收请求。我需要验证所有请求都来自 Google,并希望使用 Google 随请求发送的承载令牌来执行此操作。
我的问题是我正在努力寻找验证令牌的方法。
我已经捕获了令牌并尝试对https://oauth2.googleapis.com/tokeninfo?id_token=ey ... 进行 GET reuqes (其中 ey... 是令牌开始)。
返回:
"error": "invalid_token",
"error_description": "Invalid Value"
}
我已经尝试过 Google 的建议:
var token = req.headers.authorization.split(/[ ]+/);
client.verifyIdToken({
idToken: token[1],
audience: JSON.parse(process.env.valid_client_ids)
}).then((ticket) => {
gchatHandler.handleGChat(req.body, res);
}).catch(console.error);
并得到以下错误:
错误:找不到信封的 pem:{"alg":"RS256","kid":"d...1","typ":"JWT"}
知道我应该从这里去哪里吗?
编辑:https ://www.googleapis.com/service_accounts/v1/metadata/x509/chat@system.gserviceaccount.com发现这个,调查如何使用它。这孩子和我得到的匹配。
解决方案
最终解决了。
您需要点击:https ://www.googleapis.com/service_accounts/v1/metadata/x509/chat@system.gserviceaccount.com以获取包含与其 KID 相关联的密钥的 JSON 文件。
然后当请求到达时,使用 jsonwebtoken (NPM) 解码令牌并从标头中提取 KID。
使用 KID 在上述网站的响应中找到匹配的公钥,然后使用验证功能确保令牌与公钥匹配。
您还需要通过受众和发行者选项进行验证,以验证它是您的特定服务帐户命中机器人。
推荐阅读
- node.js - 如何在 ubuntu 上使用 express static 将 html 文件带入我的 nodejs 文件?
- javascript - Ag-Grid 为单个 rowNode 启用复选框选择
- javascript - 如何在 Ionic 中将画布保存为 jpg?
- openssl - BIO_meth_new + BIO_get_new_index 的正确用法是什么?
- sql - Redshift - 过去一小时的值的窗口函数
- python - 为什么这个while循环结束?node5 不是 NoneType。(遍历链表)
- hive - 在 HIVE 中插入当前时间戳作为多行插入的一部分
- merge - SSIS - 加入来自不同服务器的两个不同表
- wordpress - Laravel 使用 wordpress 博客从公共文件夹中安装
- batch-file - 在批处理文件中拖放-扩展此代码问题的变量