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