首页 文章

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

提问于
浏览
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上的用户进行身份验证的要求?

2 回答

  • 0

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

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

    您可以在API Console中注册您的应用程序以获取client_id和client_secret,但它们与客户经理用于获取令牌的那些不匹配 .

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

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

    • 在应用程序中使用Web服务器流程 . 这有一个明显的缺点:您需要在应用程序中嵌入一个网站,并且用户体验远非理想 . 但它应该工作 .

    • 使用Google App Engine app或Google Cloud Endpoint作为后端的条目,然后根据需要连接到您的真实后端 .

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

  • 2

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

    OAuth授权您的应用 - 您的REST API - 从Google中的用户 Profiles 中检索某些信息 . 即使您没有检索用户 Profiles 的任何详细属性,Google中帐户的存在仍然是您可以用来在应用中 Build 唯一身份的信息 . 因此,您不会违反OAuth 2.0协议的任何“规则”或“目的” .

    如果您的Android应用可以访问设备上的Google帐户并使用OAuth API,那么它应该适合您 . 如果您选择不使用令牌从Google中的用户 Profiles 中访问任何进一步的信息,则表示您没有使用其他信息,这是您的选择 . 但是,如果要检索更多信息,则需要设置范围并获得用户的同意 .

    总之,您的方法可行,您将以有限的方式使用OAuth .

相关问题