我使用 Jersey 实现创建了一些休息服务。 出于安全考虑,任何人都可以调用服务。所以我决定使用基于 token 的身份验证系统。 我在 spring security 中编写了一个过滤器,它会在每个请求到达服务器之前对其进行处理。
创建了一个登录服务,以便用户可以通过传递有效凭据的用户名和密码来调用该服务,它将生成访问 token 和到期日期,并将其保存在 Hashmap 和 DB 中,并作为响应返回给用户。
对于其余服务,用户必须在 header 中传递生成的 token 才能访问 JAX-RS 服务。
所有这些过程都是由我们编码的,即 token 的生成、存储和过期。
由于我们在市场上有一些安全API,例如oauth1,oauth2,通过上述方式为rest服务提供安全性好吗???
oauth api 能满足我的要求吗?如果是,请指导我如何实现这一目标?
请帮我提出宝贵的建议??? 提前致谢。
最佳答案
在开始使用我们的 REST API 之前,我们也处于类似的情况。唯一的区别是我们没有现有的代码。所以基本上我们看到了 2 个选择
- 运行我们自己的 token 处理,这是您已经拥有的
- 使用现有的东西,即 oauth2
我们的主要要求是通过 token 进行身份验证,我们更喜欢现有的解决方案。所以我们只是以 spring-security-oauth2 的形式运行 oauth2,即使我们没有使用整个 self 授权的东西。
我喜欢但可能在自己的实现中错过的是 token 通常标识用户和客户端组合,并且客户端也可以拥有权限。很高兴在我们的 REST API 中拥有这一额外的安全层,这样我就可以在触及我们的一行代码之前尽早阻止。
其经过验证的代码以 spring-security-oauth2 的形式运行,并且像 Spring 的大部分内容一样可定制。示例:在我们的第一个版本中,我们确实使用提供的 JdbcTokenstore 来存储 token ,但随着需求的变化,我们只是编写了自己的代码并在配置中进行了切换。
至少使用 spring-security-oauth2 的缺点是整个授权流程通常基于 Web,并且需要客户端、用户和我们的应用程序之间的通信。由于这不适用于我们的客户,我们必须自己触发 token 生成等,这在 spring 中是可行的,但需要一些代码探索:-)
如果我必须用 java 再次构建它并且已经使用 spring,我会再次使用 spring-security-oauth2 和 oauth 方式。但是,当我有一个现有的工作解决方案并且不需要任何 oauth 内容时,我会保留自制的解决方案。
关于java - 如何通过基于 token 的身份验证来保护 Rest Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199683/