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

时间:2016-04-17 14:14:34

标签: android google-app-engine go oauth google-signin

我已经成功地从我的网络服务器上的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客户端库更复杂,我需要调用GoogleIdTokenVerifier方法或verify_id_token函数来获取已在Android应用上登录的Google用户的信息。我不确定我是否朝着正确的方向前进。请指导我如何验证从Android应用收到的Google登录令牌。

1 个答案:

答案 0 :(得分:10)

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

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

  1. 点击https://www.googleapis.com/oauth2/v2/certs获取rsa公钥数组。
  2. 解码令牌。
  3. 使用"孩子"来自解码令牌的(密钥id)字段,以生成用于匹配RSA公钥的pem密钥。
  4. 使用pem键验证令牌的签名(在jwt令牌中的第二个点之后)。
  5. 现在有两个解决方案:

    1. 使用官方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没有提供像" name"这样的字段,但每个字段都包含验证令牌所需的电子邮件。)。

    2. 使用GoogleIdTokenVerifier库,它是python库的一个端口。

    3. 为提高流程效率,您可以做的是缓存证书和pem。除非有新的"孩子"来了,不要打网址。

      做基准并检查哪种方法更快。关于延迟的事情可能是错误的,因为您正在使用网络来获取证书。