我正在尝试将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吗?
答案 0 :(得分:4)
答案 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的终端进行对话。让我知道这是怎么回事。我很想看到类似的“护照 - 谷歌令牌”策略,所以如果你实施一个,请告诉我,我会链接到它!