首页 > 解决方案 > 从 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发现这个,调查如何使用它。这孩子和我得到的匹配。

标签: node.jsgoogle-apijwt

解决方案


最终解决了。

您需要点击:https ://www.googleapis.com/service_accounts/v1/metadata/x509/chat@system.gserviceaccount.com以获取包含与其 KID 相关联的密钥的 JSON 文件。

然后当请求到达时,使用 jsonwebtoken (NPM) 解码令牌并从标头中提取 KID。

使用 KID 在上述网站的响应中找到匹配的公钥,然后使用验证功能确保令牌与公钥匹配。

您还需要通过受众和发行者选项进行验证,以验证它是您的特定服务帐户命中机器人。


推荐阅读