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

Ook*_*Ook 17 google-app-engine android oauth go google-signin

我已经成功地从我的网络服务器上的Android应用程序中收到了谷歌登录令牌.我不想用

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
Run Code Online (Sandbox Code Playgroud)

因为它有关于延迟的问题和潜在的网络错误警告谷歌登录集成指导页面.所以我找到了使用Google API Client Library for Go的方法,我发现了这一点

https://github.com/google/google-api-go-client/blob/master/GettingStarted.md
Run Code Online (Sandbox Code Playgroud)

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

khr*_*hrm 12

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

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

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

现在两个解决方案

  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()
    }
    
    Run Code Online (Sandbox Code Playgroud)

    从Tokeninfo,您可以验证受众(tokenInfo.Audience)和发布到(tokenInfo.IssuedTo)是否有效.以及您要检查的其他参数.但golang的官方图书馆不遵循我之前提到的过程.它访问www.googleapis.com/oauth2/v2/tokeninfo以生成令牌信息(不是www.googleapis.com/oauth2/v3/tokeninfo.v2不会给出一些字段,如"名称",但每个字段都包含您需要的电子邮件验证令牌.)

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

你可以做些什么来提高过程的效率是缓存证书和pem.除非带有新"孩子"的令牌出现,否则不要点击网址.

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