Android 使用Google OAuth 2.0进行API身份验证

Android 使用Google OAuth 2.0进行API身份验证,android,api,authentication,oauth-2.0,Android,Api,Authentication,Oauth 2.0,我想开发一个可以从android应用程序访问的RESTAPI,但我需要授权客户端应用程序的用户。一个简单的解决方案是要求用户注册到我的服务,然后使用该用户名/密码成功调用RESTAPI。然而,我更愿意坚持使用最先进的技术,这些技术似乎将注册的便利性和更好的安全性结合起来。因此,我决定与Google OpenID或OAuth 2.0集成以进行用户身份验证和授权。我知道这两个术语和相应技术的区别,但我也发现使用OAuth 2.0的身份验证包括授权步骤 在这里发布之前,我做了很多研究,这让我找到了一个

我想开发一个可以从android应用程序访问的RESTAPI,但我需要授权客户端应用程序的用户。一个简单的解决方案是要求用户注册到我的服务,然后使用该用户名/密码成功调用RESTAPI。然而,我更愿意坚持使用最先进的技术,这些技术似乎将注册的便利性和更好的安全性结合起来。因此,我决定与Google OpenID或OAuth 2.0集成以进行用户身份验证和授权。我知道这两个术语和相应技术的区别,但我也发现使用OAuth 2.0的身份验证包括授权步骤

在这里发布之前,我做了很多研究,这让我找到了一个非标准的解决方案,我将在这里向大家介绍。关于我的案例的一些背景:RESTAPI将提供一些特定于应用程序的数据,这些数据将可供移动应用程序用户使用,但应用程序的用户将需要唯一标识,并且仅限于一定数量的调用

使用与android应用程序用户链接的Google帐户似乎是与身份验证机制轻松集成的最佳选择。然而,客户端将不会访问googleapi,而是访问我们自己的restapi,而restapi不需要对googleapi进行任何调用。但是使用Android SDK的AccountManager,我注意到我可以使用链接的google帐户的oauth access_令牌并将其发送到REST API,最后使用TokenInfo验证API检查令牌的有效性。通过这种方式,我可以重用Google帐户的身份验证来授权和验证对RESTAPI的访问


如果这听起来不标准,或者您认为它违反了OAuth 2.0协议的规则/目的,您能否指导我正确使用该协议来满足我使用Google身份验证对REST API上的用户进行身份验证的要求?

通常,OpenID用于身份验证,OAuth用于通过隐含身份验证和明示同意对用户资源进行授权

OAuth授权你的应用程序——你的RESTAPI——从谷歌的用户档案中检索某些信息。即使你没有检索到用户档案的任何详细属性,谷歌账户的存在仍然是你可以用来在应用程序中建立独特身份的信息。因此,您没有违反OAuth 2.0协议的任何“规则”或“目的”

如果您的android应用程序可以访问设备上的Google帐户并使用OAuth API,那么它应该适合您。如果您选择不使用该令牌访问谷歌用户档案中的任何进一步信息,则您不会使用进一步信息,这是您的选择。但是,如果要检索更多信息,则需要设置范围并获得用户的同意


总而言之,您的方法将起作用,并且您将以有限的方式使用OAuth。

通常,OpenID用于身份验证,OAuth用于授权用户的资源,并具有隐含身份验证和明确同意

OAuth授权你的应用程序——你的RESTAPI——从谷歌的用户档案中检索某些信息。即使你没有检索到用户档案的任何详细属性,谷歌账户的存在仍然是你可以用来在应用程序中建立独特身份的信息。因此,您没有违反OAuth 2.0协议的任何“规则”或“目的”

如果您的android应用程序可以访问设备上的Google帐户并使用OAuth API,那么它应该适合您。如果您选择不使用该令牌访问谷歌用户档案中的任何进一步信息,则您不会使用进一步信息,这是您的选择。但是,如果要检索更多信息,则需要设置范围并获得用户的同意


总之,您的方法将起作用,并且您将以有限的方式使用OAuth。

我正在研究相同的问题。到目前为止,我还没有找到任何合理的方法:(

您设法使其工作的解决方案(使用AccountManager获取令牌,安全地将该令牌发送到后端,然后使用此令牌通过userinfo服务进行验证,以检查电子邮件是否已验证)有一个缺陷:它仅限于匿名配额。您的后端在查询userinfo服务时未使用客户端id和客户端机密,您可能很快就会用完配额

您可以在中注册应用程序以获取客户端id和客户端密码,但它们与帐户经理用于获取令牌的密码不匹配

Google Play Services简化了用户的开发过程和用户界面体验,但他们仍然发布了一个无效的令牌,无法传输到您的后端进行验证。在这种情况下,令牌是使用您的开发密钥签名获得的,因此它只对您的应用程序有效。它相当于客户端id或客户端机密,但我不知道是否有办法在服务器中复制这些参数(前提是服务器可以访问用于签署Android应用程序的相同密钥)

我正在考虑另外两种可能的解决方案:

  • 在应用程序中使用web服务器流。这有一个明显的缺点:你需要在应用程序中美化一个网站,用户体验远不是理想的。但它应该可以工作
  • 使用或Google云端点作为后端的入口,然后根据需要连接到真正的后端

如果您有任何其他想法或想法,我们将不胜感激。

我也在考虑同样的问题。到目前为止,我还没有找到任何合理的方法来解决这个问题:(

您设法使其工作的解决方案(使用AccountManager获取令牌,安全地发送该令牌)-