【问题标题】:How to secure the Rest webservice by token based authentication?如何通过基于令牌的身份验证来保护 Rest web 服务?
【发布时间】:2014-08-03 16:19:51
【问题描述】:

我使用 jersey 实现创建了一些休息服务。 出于安全考虑,服务可以被任何人调用。所以我决定使用基于令牌的身份验证系统。 我在 Spring Security 中编写了一个过滤器,它在每个请求到达服务器之前处理它。

创建了一个登录服务,因此用户可以通过传递有效凭据的用户名和密码来调用此服务,它将生成访问令牌和到期日期并将其保存在 Hashmap 和 DB 中,并作为对用户的响应返回。

对于剩余的服务,用户必须在标头中传递生成的令牌才能访问 JAX-RS 服务。

所有这些过程都由我们编码,即令牌的生成、存储和到期。

既然我们在市场上有一些像oauth1,oauth2这样的安全API,那么通过上述方式为休息服务提供安全性好吗???

oauth api 是否适合我的要求。如果是,请指导我如何实现这一目标?

请帮我提出宝贵的建议??? 提前致谢。

【问题讨论】:

  • 我想为我的球衣网络服务实现与安卓 iOS 通信的相同结构。你能分享一些用于生成令牌的示例代码吗?

标签: java security authentication spring-security jax-rs


【解决方案1】:

在开始使用我们的 rest api 之前,我们处于类似的位置。唯一的区别是我们没有现有的代码。所以基本上我们看到了 2 个选择

  1. 运行我们自己的令牌处理,即您已经拥有的
  2. 使用现有的东西,即 oauth2

我们的主要要求是通过令牌进行身份验证,我们更喜欢现有的解决方案。所以我们只是以 spring-security-oauth2 的形式运行 oauth2,即使我们没有使用整个自我授权的东西。

  • 我喜欢并且可能在自己的实现中错过的是令牌通常标识用户和客户端组合,并且客户端也可以拥有权限。很高兴在我们的 REST API 中拥有这一额外的安全层,这样我就可以在到达我们的代码行之前尽早阻止。

  • 以 spring-security-oauth2 的形式,其经过验证的代码可以正常工作,并且与 spring 的大部分内容一样可定制。示例:在我们的第一个版本中,我们确实使用了提供的 JdbcTokenstore 来存储令牌,但是随着需求的变化,我们只是编写了自己的代码并在配置中进行了切换。

  • 至少使用 spring-security-oauth2 的缺点是整个授权流程通常是基于 Web 的,需要客户端、用户和我们的应用程序之间的通信。由于这不适用于我们的客户,我们必须自己触发令牌生成等,这在 spring 中是可行的,但需要一些代码探索:-)

如果我必须使用 java 再次构建它并且已经使用 spring,我会再次使用 spring-security-oauth2 和 oauth 方式。但是当我有一个现有的工作解决方案并且不需要任何 oauth 的东西时,我会保留自己的解决方案。

【讨论】:

  • 感谢您的回复 azarai。您在您的帖子中提到,安全性将使用 oauth 或 oauth2 为 rest api 提供。但是我已经读过,当第三方服务器出现时,oauth 适合,如果我错了,请纠正我?这里没有使用任何第三方 api,如 facebook、twiter 等。那么 oauth 如何满足我的要求?
  • 客户应用是第三方服务器。 OAuth 有助于“简化”服务器 B(客户应用程序)如何与服务器 A(Rest API)就用户(在两个应用程序/服务器中都有帐户)的行为以及如何注册和获取访问权限进行对话。用户将服务器 B 的访问权限授予服务器 A 后,服务器 A 会返回一个 accessToken。当服务器 B 调用服务器 A 上的 api 端点时,此令牌用于实际身份验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多