使用令牌保护REST api

时间:2014-11-01 09:14:45

标签: java spring rest authentication spring-security

过去几天我一直在努力解决这个问题,并且没有在网上找到可靠,易懂的解决方案。

我有一个网络应用程序,它由一个rest api和一个使用它的表示层组成。表示层具有登录表单,用户引入的数据被发送到REST api,然后REST api使用第三方服务来验证用户。这部分我已经设置好了。

我现在想要的是为每个后续请求引入基于令牌的身份验证,因此我不必在每个请求上发送凭据,然后再次针对第三方服务进行身份验证。

基本上,使用Spring Security(v.3.1.3),我很遗憾如何创建一个可靠的安全令牌,将其返回给请求者,然后根据所述令牌验证请求。

你能指出我正确的方向吗?或者在网上的一些例子?

  • 如何生成令牌?你如何将令牌返回给 客户?
  • 您将如何在后续请求中发送令牌?
  • 如何在第一时间完成整个过程 以某种方式发送凭证(用户/通行证)然后发送 请求只发送令牌?
  • 您如何对令牌进行身份验证?
  • 我见过令牌包含一些expiryTime的实现。那么到期后的快乐是用尽了吗?用户必须再次登录,即使他一直在提出请求吗?我是否应该在幕后续订令牌"?

1 个答案:

答案 0 :(得分:1)

服务器端REST应用程序是有状态还是无状态?如果是有状态的,您将不需要使用常规HTTP会话执行任何特殊操作。刚开始使用Spring Security,如果客户端和服务器已经在交换会话信息,那么受保护的API端点将开箱即用。唯一需要注意的是,如果启用了CSRF保护,在这种情况下,您需要稍微调整一下客户端。有关详细信息,请参阅Spring Security文档。

另一方面,如果REST应用程序是无状态的,则必须使用像您提议的基于令牌的方法。有关详细信息,请参阅my answer to a similar post。如果您确实选择按照该答案中的步骤操作,那么您的问题的答案就是:

  • 必须在服务器端生成令牌。如果您查看链接到我的答案的示例代码,您将看到我已使用基于缓存的基础结构替换了Spring Security的默认HTTP会话相关基础结构。在基于会话的实现中,唯一会话标识符(会话ID)由servlet容器生成,而在自定义实现中,标识符(即标记)在应用程序内生成。具体来说,我使用SecureRandom实例生成强令牌。
  • 令牌由客户端作为HTTP标头发回。这可以通过SSL通道保护内容。
  • 诀窍是从Spring Security实现四个非常简单的接口。我的示例应用程序有详细信息。整个过程花了不到一个小时。
  • 针对令牌的身份验证由Spring Security自动完成。我们只需要提供一个存储和检索令牌的实现,这很简单,只需几行代码。
  • 在我的示例应用程序中,我使用了具有滑动过期的可过期缓存来存储令牌。如果客户端不断定期发送请求,则服务器会继续访问身份验证令牌的缓存,从而使令牌在缓存中保持活动状态。只有在一段不活动时间等于或超过缓存有效期后,才会从缓存中驱逐令牌。

总的来说,使用Spring Security可以轻松实现基于令牌的身份验证/授权方法,并利用像EHCACHE这样的缓存库。