为 iOS/Android 应用程序保护基于 REST 的服务的选项

Posted

技术标签:

【中文标题】为 iOS/Android 应用程序保护基于 REST 的服务的选项【英文标题】:Options for securing REST based service for iOS/Android app 【发布时间】:2014-06-20 19:49:21 【问题描述】:

我正在开发一个实现在线购物功能的 Web 应用程序。我正在使用 Struts2 + Spring + Hibernate。我正在使用 Spring 安全性来实现授权和身份验证。

现在我的客户想要开发一个 ios/android 应用程序,让我的网络应用程序的用户可以登录并使用该应用程序的某些功能。

移动应用程序将访问 JSON 上基于 REST 的 Web 服务,该服务将使用 Jersey 实现。以下是我的问题:

    用户将拥有其中三个角色中的一个角色。根据角色,他们应该能够访问特定资源。我正在考虑将 Spring Security 2.0 与 Jersey 一起使用,并使用 OAuth 2.0 对用户进行身份验证。 OAuth 2.0 是正确的适用选择吗?

    此外,Jersey 不支持服务器端的 oAuth 2.0。仍然我想我应该能够使用任何其他 OAuth 提供商来保护 Jersey 服务,对吗?

    如果 oAuth 不是正确的选择,那么我可以使用什么来为移动应用程序用户提供基于角色的身份验证和授权到我的 REST Web 服务。

【问题讨论】:

您好,我现在正在处理同样的问题,您找到解决方案了吗?我个人认为可能会使用 canfoundry 的 UAA,因为实现我自己的身份验证服务器和资源服务器似乎有点过分...... @RadiRadichev 不,我暂时把它放在次要位置,因为我正忙于其他事情。但是是的,一旦我重新开始,我会更新。如果你成功了,如果你用你的实现来回答这个问题,那就太好了。谢谢。我也放弃了使用 JERSEY 的想法,并将使用 Spring MVC 支持 REST 【参考方案1】:

在不得不处理同样的问题后,我做了一些研究,目前我可以看到 3 个解决方案。

    Pivotal 实际上有一个用于他们的 cloudfoundry 服务的软件,称为 UAA(用户帐户和身份验证)服务器。你可以将它部署到你自己的服务器上,它的作用基本上是提供 OAuth2 访问令牌。如果请求中提供了正确的 OAuth 令牌,您将需要创建自己的资源服务器,该服务器将提供不同的资源。 (他们在 UAA 存储库中有几个示例应用程序可供您使用)https://github.com/cloudfoundry/uaa

    Google 实际上提供了类似的服务。如果你在 appengine 上托管你的后端,你可以使用云端点来公开你的 API,它们负责身份验证和授权。 https://cloud.google.com/appengine/docs/java/endpoints/

    您可以创建自己的架构。基本方法是拥有一个授权服务器(生成令牌)、一个资源服务器(为您的 API 提供服务)以及某种用于用户和令牌的存储。

希望对你有所帮助,我个人会和 UAA 一起去尝试一下。

【讨论】:

谢谢。正如我所说,当我回到这个问题时,我会评估并接受你的答案,如果它很好。 嗨 Radi Actaully 我开始了这方面的工作,我觉得使用 OAuth2 会有点过头了,因为我的不是公共 API。所以我选择了简单的选项 JWT 令牌。我在用户第一次登录时创建了一个签名的 JWT 令牌。然后,这个令牌在每个后续请求的标头中发送。我验证令牌的签名和令牌的到期。如果它没有过期并且签名匹配,我会继续,否则我会拒绝该请求。目前,我已将到期时间保持足够长,以便用户不必在每次令牌到期时登录。 现在它的实现非常简单,我将继续添加处理来自两个设备的多个登录等功能。如果您在我的实现中发现任何问题或改进,请提出建议【参考方案2】:

不要忘记您可以使用简单的 HTTP BASIC 身份验证(当然,使用 SSL)。

有关 OAuth 版本的比较,请参阅this.

【讨论】:

以上是关于为 iOS/Android 应用程序保护基于 REST 的服务的选项的主要内容,如果未能解决你的问题,请参考以下文章

运维之道基于图像识别的保护压板状态识别技术研究与应用

如何保护基于 GPL 的应用程序免受未经授权的使用? [关闭]

如何获取用户当前的国家并保护它免受操纵?

保护基于prototype.js的XHR请求免受CSRF

为 iOS 和 Android 自动安装应用程序?

为 iOS/Android 应用程序存储敏感数据的最佳方式是啥?