用于在 GAE 上的 Go 运行 中验证 Google 登录令牌的包
Package for verifying Google sign-in token in Go running on GAE
我已经从我的网络服务器上的 Android 应用程序成功收到 google 登录令牌,该应用程序是在 GAE 上用 Go 运行 编写的。我不想使用
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
因为它在 google 登录集成指导页面上警告了有关延迟和潜在网络错误的问题。所以我正在寻找使用 Google API Client Library for Go 的方法,我发现了这个
https://github.com/google/google-api-go-client/blob/master/GettingStarted.md
我发现它比 Java 和 Python Google API 客户端库更复杂,我只需要调用 Google IdTokenVerifier 方法或 verify_id_token 函数获取已登录 Android 应用程序的 google 用户的信息。我不确定我会朝着正确的方向前进。请指导我如何验证从 Android 应用收到的 google 登录令牌。
我最近也遇到了这个问题并找到了两个解决方案。
但在此之前,您需要了解 python(或其他推荐的客户端库)的库的功能。
- 点击 https://www.googleapis.com/oauth2/v2/certs 获取 rsa public 键数组。
- 解码令牌。
- 使用解码令牌中的 "kid"(密钥 ID)字段生成用于匹配 RSA public 密钥的 pem 密钥。
- 使用 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 用于生成 tokeninfo
(不是 www.googleapis.com/oauth2/v3/tokeninfo。v2 没有像 "name" 这样的字段,而是每个字段,包括您需要验证令牌的电子邮件。)。
使用 GoogleIdTokenVerifier 库,它是 python 库的端口。
提高进程效率的方法是缓存证书和 pem。除非出现带有新"kid"的令牌,否则不要点击url。
进行基准测试并检查哪种方法更快。当您使用网络获取证书时,关于延迟的事情可能是错误的。
我已经从我的网络服务器上的 Android 应用程序成功收到 google 登录令牌,该应用程序是在 GAE 上用 Go 运行 编写的。我不想使用
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
因为它在 google 登录集成指导页面上警告了有关延迟和潜在网络错误的问题。所以我正在寻找使用 Google API Client Library for Go 的方法,我发现了这个
https://github.com/google/google-api-go-client/blob/master/GettingStarted.md
我发现它比 Java 和 Python Google API 客户端库更复杂,我只需要调用 Google IdTokenVerifier 方法或 verify_id_token 函数获取已登录 Android 应用程序的 google 用户的信息。我不确定我会朝着正确的方向前进。请指导我如何验证从 Android 应用收到的 google 登录令牌。
我最近也遇到了这个问题并找到了两个解决方案。
但在此之前,您需要了解 python(或其他推荐的客户端库)的库的功能。
- 点击 https://www.googleapis.com/oauth2/v2/certs 获取 rsa public 键数组。
- 解码令牌。
- 使用解码令牌中的 "kid"(密钥 ID)字段生成用于匹配 RSA public 密钥的 pem 密钥。
- 使用 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 用于生成 tokeninfo (不是 www.googleapis.com/oauth2/v3/tokeninfo。v2 没有像 "name" 这样的字段,而是每个字段,包括您需要验证令牌的电子邮件。)。
使用 GoogleIdTokenVerifier 库,它是 python 库的端口。
提高进程效率的方法是缓存证书和 pem。除非出现带有新"kid"的令牌,否则不要点击url。
进行基准测试并检查哪种方法更快。当您使用网络获取证书时,关于延迟的事情可能是错误的。