我正在开发一个android应用程序,该应用程序使用设备上可用的谷歌帐户向服务器端组件验证用户。
我将谷歌帐户名(gmail地址)发送到服务器,但为了能够在服务器上与谷歌进行验证,我在安卓设备上请求oauth令牌,并将其发送到服务器。
问题是,尽管我不需要访问其他用户信息,但我必须使用oauth电子邮件范围,它会打开一个确认对话框。我不喜欢这个对话框,因为我要验证帐户名,而不是访问用户信息。
还有
AccountManager.getPassword(account)
,但我不喜欢交流或使用用户密码
也可以像web应用程序一样使用WebView和身份验证用户(例如使用OpenId),但这似乎不是设备上的最佳解决方案。
是否有其他/更好的方法来验证服务器上的设备帐户名称?
使用AccountManager或Google Play Services为用户配置文件获取OAuth2令牌(作用域:https://www.googleapis.com/auth/userinfo.profile)。然后使用Google端点进行验证(https://accounts.google.com/o/oauth2/tokeninfo)并可选地获取用户信息。此处提供了一个示例应用程序:http://oauthssodemo.appspot.com.你似乎在做类似的事情,如果是这样,这是正确的(或者至少是推荐的)方法。顺便说一句,您无法获得用户密码,因为您没有使用与帐户提供商相同的证书进行签名。
唯一(可靠)的方法是向用户发送一封带有随机令牌的电子邮件到他们的GMail地址,并让他们在应用程序中输入。这可以让你验证他们是否有权访问电子邮件,所以它必须是他们的(当然,除非他们偷了别人的设备)。
或者,你可以简单地相信,如果用户在他们的设备上注册了帐户,那就是他们的帐户,因为他们在激活设备时至少进行了一次身份验证。然后你只需按原样使用Gmail地址,这对你的应用程序来说可能不够,也可能不够。
如果没有有效的令牌,就无法验证Google帐户。你可能想参考下面的Android官方文档。
http://developer.android.com/training/id-auth/index.html
本文用源代码详细描述了验证过程:
Tim Bray 验证来自Android应用程序的后端呼叫
短版本:您使用GoogleAuthUtil类,可通过Google Play服务,以检索一个名为"ID令牌"的字符串。你将令牌发送到您的后端,您的后端可以使用它快速而廉价地验证是哪个应用程序发送的,以及谁在使用应用程序。
有了本文中的信息,我很容易实现客户端和服务器端的Android和JavaEE代码。
我建议这样做:
-
设备上
-
选择一个帐户(获取电子邮件地址)
-
请求OAuth令牌
-
-
将电子邮件+令牌发送到服务器
-
服务器上
-
使用Google的API从令牌中检索基本用户信息
-
将谷歌返回的电子邮件地址与收到的进行比较
-