用于在 GAE 上运行的 Go 中验证 Google 登录令牌的包

Posted

技术标签:

【中文标题】用于在 GAE 上运行的 Go 中验证 Google 登录令牌的包【英文标题】:Package for verifying Google sign-in token in Go running on GAE 【发布时间】:2016-08-09 05:27:44 【问题描述】:

我已成功从我的 Web 服务器上的我的 android 应用程序接收到 google 登录令牌,该应用程序是用 GAE 上运行的 Go 编写的。我不想使用

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123

因为它在谷歌登录集成指导页面上警告了延迟和潜在网络错误的问题。所以我正在寻找使用 Google API Client Library for Go 的方法,我发现了这个

https://github.com/google/google-api-go-client/blob/master/GettingStarted.md

我发现它比 Java 和 Python Google API 客户端库更复杂,我只需要调用 GoogleIdTokenVerifier 方法或 verify_id_token 函数来获取已在 Android 应用上登录的 google 用户的信息。我不确定我会朝着正确的方向前进。请指导我如何验证从 Android 应用收到的 google 登录令牌。

【问题讨论】:

您想使用哪个 Google API? 我想使用谷歌登录api。我只想验证从 Android 应用发送的令牌。用户从应用程序登录,应用程序将令牌发送到我的后端服务器。 您写道:“我只想验证从 Android 应用发送的令牌”。这句话没有太多意义。您想在 go 服务器端进行身份验证,还是想在 Android 上进行?请澄清。 用户将使用谷歌登录在运行安卓应用的手机上登录系统。然后,android 应用程序会将令牌发送到用 Go 编写的 Web 应用程序。 Web 应用程序将验证令牌并检查 Google App Engine 数据存储中的现有 Google 用户 ID。只有当令牌在 Web 应用程序端被验证为有效时,用户才能从 Web 应用程序将他们的私有数据检索到 android 应用程序。 “谷歌登录集成指导页面上警告的延迟和潜在网络错误问题”相当愚蠢。文档指出的是一个明显的点,即额外的 API 请求实际上是一个额外的网络请求,需要时间。没有理由不使用原始 API 端点。只需将额外的 API 请求视为实际授权用户的 google 帐户所用时间的一部分。 【参考方案1】:

我最近也遇到了这个问题并找到了两个解决方案。

但在此之前,您需要了解 python(或其他推荐的客户端库)的库是做什么的。

    点击https://www.googleapis.com/oauth2/v2/certs 获取 rsa 公钥数组。 解码令牌。 使用解码令牌中的“kid”(密钥 ID)字段来生成匹配 RSA 公钥的 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 没有提供像“名称”这样的字段,而是每个字段,包括您需要验证令牌的电子邮件。)。

    使用GoogleIdTokenVerifier库,这是python库的一个端口。

您可以做的提高进程效率的方法是缓存证书和 pem。除非带有新“孩子”的令牌出现,否则不要点击网址。

进行基准测试并检查哪种方法更快。当您使用网络获取证书时,关于延迟的事情可能是错误的。

【讨论】:

以上是关于用于在 GAE 上运行的 Go 中验证 Google 登录令牌的包的主要内容,如果未能解决你的问题,请参考以下文章

在 GAE 应用程序中连接到 PubSub

如何在私有服务器上运行 GAE 应用程序?

用于注册验证的 GAE 数据库的强一致性查询

GAE Go Json-RPC 调用示例

在验证其ID令牌(GAE / Firebase)后重定向用户

用于休息 api 的 Python 删除请求(在 gae 上)