在Node.js服务器中validationGoogle授予的OAuth令牌的正确方法是什么?

我试图validationAndroid平台的移动应用程序自定义node.js服务器API。 我想为此使用Google OAuth2令牌,而不是推出自己的身份validation,因为安装了Google Play的Android设备可以让应用开发者使用。 我正在使用Google Play服务库中的GoogleAuthUtil.getToken调用, 这里logging了GoogleAuthUtil.getToken调用。 我试图按照这个Android开发人员博客post概述的build议

getToken方法在我的情况下返回一个长857字节的string。 如果我尝试将此令牌传递给Google的TokenInfo端点,则会返回:

{'错误':'invalid_token','error_description':'无效的值'}

我在这里做错了什么? 在getToken调用的“范围”中,我发送: audience:server:client_id:**i_put_my_clientid_here** 。 我有一个clientid为“已安装的应用程序”生成。 使用这个客户端ID,对getToken的调用根本不起作用。 当我生成一个“服务帐户”的客户端ID,调用成功,但我得到一个857字节的令牌失败,如上所述传递到TokenInfo端点。

编辑:我也创build了“Web应用程序”的客户端ID,因为它似乎是调用getToken时使用的正确的客户端ID。 但行为是一样的,我得到一个857字节的令牌,调用Google的端点时不validation。

如何在Android上使用Google Play服务正确获取有效的身份validation令牌? 一旦我有正确的标记,什么是正确的node.js库来validation它的服务器端? 我可以使用passport-google-oauth吗?

如果您只想读取GoogleAuthUtil.getToken返回的数据的内容,那么过程非常简单。 返回的数据只是一个JWT。 所以你所要做的就是分割数据. 字符,然后base64(url)解码每一块。

如果你想要validation消息的真实性,它会变得稍微复杂一点。 只需使用你最喜欢的encryption库来进行validation。 JWT的第三部分是数据的签名, Google证书是公开的 ; 这就是所有你需要validation的消息。

嗯,这真的是一个评论,而不是一个答案,但我不能把换行符:

  1. 它必须是put_my_clientid_here现场的networking端 Clent ID
  2. 如果GoogleAuthUtil.getToken()给你一个string,抛出一个exception,它真的应该是有效的。 当你点击tokeninfo的时候,你是否使用… tokeninfo?id_token = <857-byte-value-here>
  3. 如果您是rubyist,请抓住google-id-token gem,看看它是否可以validation您的857字节的令牌。

一个星期以来,我一直在研究如何validation在Node.js服务器上使用passport.js在Android Client应用程序中接收到的GoogleAuthUtil令牌

最后,我遇到了完美执行任务的护照 – 谷歌令牌护照策略。

https://www.npmjs.com/package/passport-google-token

更多细节在上面的链接中。

官方的节点SDK可以让你现在这样做。

以下是链接: https : //github.com/google/google-auth-library-nodejs/blob/master/lib/auth/oauth2client.js#L384

我不太了解Android如何将令牌从设备传递到服务器的细节。 然而,我的一般印象是,你没有通过典型的基于networking的OAuth舞蹈。 而是直接调用“用户信息”端点,该端点将返回与持有令牌的用户相对应的信息,或者在令牌无效的情况下拒绝该请求。 有一些关于这个相关问题的讨论:

在第三方服务器上validationAndroid的authToken

实际上,令牌变成了设备和服务器之间共享的秘密,所以保护它非常重要。

Facebook和Twitter有一些策略是用iOS设备的令牌来开发类似的东西的:

https://github.com/drudge/passport-twitter-token
https://github.com/drudge/passport-facebook-token

你可以从他们那里得到一些启发,调整它与Google的端点进行交stream。 让我知道这是如何结果。 我很想看到一个类似的“护照 – 谷歌令牌”策略,所以如果你实施一个,让我知道,我会链接到它!