1

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

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

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

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

4

2 回答 2

2

通常,OpenID 用于身份验证,OAuth 用于通过隐含身份验证和明确同意授权用户资源。

OAuth 授权您的应用程序(您的 REST API)从 Google 内的用户个人资料中检索某些信息。即使您不检索用户个人资料的任何详细属性,Google 中帐户的存在仍然是您可以用来在您的应用程序中建立唯一身份的信息。因此,您不会违反 OAuth 2.0 协议的任何“规则”或“目的”。

如果您的 android 应用程序可以访问设备上的 Google 帐户并使用 OAuth API,那么它应该适合您。如果您选择不使用令牌从 Google 中的用户个人资料中访问任何更多信息,则您没有使用更多信息,这是您的选择。但是,如果您想检索更多信息,则需要设置范围并获得用户的同意。

总之,您的方法会奏效,并且您将以有限的方式使用 OAuth。

于 2012-12-12T14:04:46.623 回答
2

我在看同样的问题。到目前为止,我还没有找到任何合理的方法来做到这一点:(

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

您可以在API 控制台中注册您的应用程序以获取 client_id 和 client_secret,但它们与客户经理用于获取令牌的内容不匹配。

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

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

  • 在应用程序中使用 Web 服务器流。这有一个明显的缺点:您需要在应用程序中嵌入一个网站,用户体验远非理想。但它应该工作。
  • 使用Google App Engine 应用程序或 Google Cloud Endpoint 作为后端的入口,然后根据需要连接到您的真实后端。

任何其他想法或想法将不胜感激。

于 2012-12-20T12:57:10.703 回答