在node.js服务器中验证Google授权的OAuth令牌的正确方法是什么?

时间:2013-05-01 04:34:18

标签: android node.js security oauth google-authentication

我正在尝试将Android平台的移动应用程序验证为自定义node.js服务器api。我想使用Google OAuth2令牌而不是推出自己的身份验证,因为安装了Google Play的Android设备可以让应用开发者使用它。我正在使用Google Play服务库中的GoogleAuthUtil.getToken来电,记录为here。我正在尝试遵循此android developers blogpost

中列出的建议

getToken方法在我的例子中返回一个长857字节的字符串。如果我尝试将此令牌传递给Google的TokenInfo端点,则会返回:

  

{'error':'invalid_token','error_description':'无效值'}

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

编辑: 我还为“Web应用程序”创建了一个客户端ID,因为它似乎是在调用getToken时使用的正确客户端ID。但是行为是一样的,我得到了一个857字节的令牌,在调用谷歌的终端时没有验证。

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

5 个答案:

答案 0 :(得分:4)

嗯,这实际上是一个评论而不是一个答案,但我不能在这些内容中添加换行符:

  1. 它必须是put_my_clientid_here点中的网络侧 Clent ID
  2. 如果GoogleAuthUtil.getToken()为您提供了一个抛出异常的字符串,它确实应该是有效的。当您点击tokeninfo时,您是否使用了... tokeninfo?id_token =< 857-byte-value-here>
  3. 如果您是rubyist,请抓住google-id-token gem并查看它是否可以验证您的857字节令牌。

答案 1 :(得分:3)

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

如果您想要验证消息的真实性,会稍微复杂一些。只需使用您最喜欢的加密库进行验证即可。 JWT的第3个组成部分是数据的签名和the Google certs are publicly available;这就是验证消息所需的全部内容。

答案 2 :(得分:2)

一周以来,我一直在研究如何使用passport.js验证在Node.js服务器上的Android客户端应用程序中收到的GoogleAuthUtil令牌

最后,我遇到了护照 - 谷歌令牌护照策略,完美地完成了任务。

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

上述链接中提供了更多详细信息。

答案 3 :(得分:2)

官方节点SDK允许您现在就这样做。

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

答案 4 :(得分:1)

我不太熟悉Android在将令牌从设备交付到服务器方面的工作原理。然而,我的总体印象是,你没有经历典型的基于网络的OAuth舞蹈。相反,您直接调用“用户信息”端点,该端点将返回与持有令牌的用户对应的信息,或者如果令牌无效则拒绝该请求。关于这个相关问题有一些讨论:

validating Android's authToken on third party server

实际上,令牌成为设备和服务器之间共享的秘密,因此保护它很重要。

Facebook和Twitter有一些策略可以使用来自iOS设备的令牌进行类似的操作:

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

您可以从中获取灵感并进行调整以与Google的终端进行对话。让我知道这是怎么回事。我很想看到类似的“护照 - 谷歌令牌”策略,所以如果你实施一个,请告诉我,我会链接到它!