繁体   English   中英

使用令牌保护REST API

[英]Securing REST api with Token

最近几天,我一直在为此苦苦挣扎,并且在网络上找不到可靠,可理解的解决方案。

我有一个Web应用程序,由一个休息api和一个使用它的表示层组成。 表示层具有一个登录表单,用户引入的数据被发送到REST api,后者随后使用第三方服务来对用户进行身份验证。 我已经设置了这一部分。

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

因此,基本上,使用Spring Security(v。3.1.3),我不知道如何创建可靠,安全的令牌,将其返回给请求者,然后根据所述令牌对请求进行身份验证。

你能指出我正确的方向吗? 还是网上的一些例子?

  • 您如何生成令牌? 您如何将令牌返还给客户?
  • 您如何在后续请求中发送令牌?
  • 您如何设置整个内容,以便第一次以某种方式发送凭据(用户/密码),然后后续请求仅发送令牌?
  • 您如何针对令牌进行身份验证?
  • 我已经看到令牌包含一些expiryTime的实现。 那么,到期时间用完后会发生什么? 即使他一直在提出请求,用户也必须再次登录? 我应该在“幕后”续签令牌吗?

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

另一方面,如果REST应用程序是无状态的,则您将必须像建议的那样使用基于令牌的方法。 有关详细信息,请参见我对类似帖子的回答 如果您确实选择按照该答案中的步骤进行操作,则对问题的答案为:

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

因此,总的来说,基于令牌的身份验证/授权方法可以通过Spring Security并利用EHCACHE之类的缓存库轻松实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM