Tim*_*mmm 63 android oauth google-authentication oauth-2.0
我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份验证.由于它是Android应用程序,我将开始使用Google的OAuth2内容,因为它在Android上提供了不错的用户界面.
Google表示,"您可以选择使用Google的身份验证系统作为外包用户身份验证的方式.这可以消除创建,维护和保护用户名和密码存储的需要." 这就是我想要做的.然而,当我浏览他们的所有示例和诸如此类的东西时,我只能找到有关网站或应用程序根据Google服务对用户进行身份验证的内容.
事实上,当我使用Google的OAuth2注册我的应用程序("客户端")时,网站客户端和"已安装"客户端(即移动应用程序)可以选择,但不能同时选择两者.我可以创建两个单独的客户端,但我读了OAuth2草案,我认为会有一个问题,我现在将解释.
以下是我设想的工作方式:
AccountManager
类为Google的API请求访问令牌.AccountManager
使用手机上存储的凭据连接到Google的OAuth2服务器,并要求提供访问令牌.AccountManager
将访问令牌返回给MyApp.那我该怎么做呢?请不要说"使用OpenID"或"不要使用OAuth2"或其他类似无益的答案.哦,我真的想用漂亮的,以保持AccountManager
用户界面,而不是糟糕的弹出WebView
小号
来自Nikolay的临时答案(我会报告它是否有效!)它实际上应该有效,而Google的服务器并不关心访问令牌的来源.对我来说似乎有点不安全,但我会看看它是否有效!
我用Facebook而不是Google实现了这种模式,它完全有效.OAuth2服务器不关心访问令牌的来源.至少Facebook没有,所以我认为谷歌也没有.
鉴于此,存储访问令牌是一个非常糟糕的主意!但是我们也不想让Facebook/Google的服务器检查每个请求的身份验证,因为它会减慢一切.可能最好的办法是为您的站点添加一个额外的身份验证cookie,当您的访问令牌被验证时,您可以将其分发,但更简单的方法就是将访问令牌视为密码并存储其哈希值.你不需要加盐它,因为访问令牌真的很长.所以上面的步骤变成了:
9. MySite需要使用访问令牌验证用户.首先,它检查哈希有效访问令牌的缓存.如果在那里找到令牌的散列,则它知道用户已经过身份验证.否则,它会按照此处所述与Google进行核对- Google,"此令牌是否有效?".
10.如果Google说访问令牌无效,我们会告诉用户GTFO.否则谷歌说"是的,这是一个有效的用户",然后我们检查我们的注册用户数据库.如果找不到Google用户名(或Facebook id,如果使用Facebook),我们可以创建新用户.然后我们缓存访问令牌的散列值.
我刚刚发布了类似StackOverflow问题的答案.
谷歌称之为混合应用程序,并解释了"Android应用如何获得Web后端的离线访问".
它的要点是你必须传递一个按摩scope
字符串GoogleAuthUtil.getToken
,以使其返回授权码(而不是OAuth2令牌).根据此原理图,该授权码可以从您的移动应用程序传递到您的服务器,并可以交换为OAuth2令牌和刷新令牌.
该scope
参数需要是这个样子:
oauth2:server:client_id:<your_server_client_it>:api_scope:<scope_url_1> <scope_url_2> ...
Run Code Online (Sandbox Code Playgroud)
您可能需要 OpenID Connect,它使用 OAuth 令牌进行身份验证。至于AccountManager
,当前的 OAuth 支持有点老套,即将发布的新Google Play 服务有望让这一点变得更好。请参阅此处的演示。
归档时间: |
|
查看次数: |
16667 次 |
最近记录: |