1 回答
TA贡献1812条经验 获得超5个赞
我最近也遇到了这个问题,并找到了两个解决方案。
但在此之前,您需要了解 python(或其他推荐的客户端库)的库是做什么的。
它点击https://www.googleapis.com/oauth2/v2/certs以获取 rsa 公钥数组。
解码令牌。
使用解码令牌中的“kid”(密钥 ID)字段生成 pem 密钥以匹配 RSA 公钥。
使用 pem 密钥验证令牌的签名(在 jwt 令牌中的第二个点之后)。
现在有两种解决方案:
使用官方 oauth 库“google.golang.org/api/oauth2/v2”
func getTokenInfo(idToken string) (*oauth2.Tokeninfo, error) {
oauth2Service, err := oauth2.New(&http.Client{})
if err != nil {
return nil, err
}
tokenInfoCall := oauth2Service.Tokeninfo()
tokenInfoCall.IdToken(idToken)
return tokenInfoCall.Do()
}
从 Tokeninfo 您可以验证受众 (tokenInfo.Audience) 和颁发给 (tokenInfo.IssuedTo) 是否有效。以及您要检查的其他参数。但是golang的官方库并没有按照我之前提到的流程进行。它点击 www.googleapis.com/oauth2/v2/tokeninfo 以生成令牌信息(不是 www.googleapis.com/oauth2/v3/tokeninfo。v2 没有提供诸如“名称”之类的字段,但包括您需要的电子邮件在内的每个字段以验证令牌。)。
使用GoogleIdTokenVerifier库,它是 python 库的一个端口。
您可以做些什么来提高流程效率,那就是缓存证书和 pem。除非带有新“孩子”的令牌出现,否则不要点击网址。
做基准测试并检查哪种方法更快。当您使用网络获取证书时,有关延迟的事情可能是错误的。
- 1 回答
- 0 关注
- 266 浏览
添加回答
举报