我的申请流程如下:
在一次采访中我被问到这不是一个纯粹的RestFull 标准,因为现在所有资源都依赖于令牌资源,即在调用任何api客户端之前必须调用token api并且在这种情况下,资源将成为紧密耦合和排序。根据其他标准,所有资源都应该是独立的。
所以我的问题是:
1。使用令牌,我的资源如何变得独立?
的 2。使用令牌是非标准方式吗?那么为什么很多应用程序都使用令牌。
一种方法是使用api而不是令牌使用基本身份验证,但这样我必须在客户端应用程序中保留商店用户名和密码,直到登录为止。不安全在客户端应用程序中保存密码。
答案 0 :(得分:1)
老实说,如果应用程序没有破坏Roy Thomas Fielding关于REST的论文chapter 5中定义的约束集,我认为令牌没有任何问题:
我们来看看stateless constraint:
[...]从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。 [...]
如果您要访问需要身份验证的受保护资源,则每个请求都必须包含所有必要的数据才能进行正确身份验证/授权,从而将会话状态保留在客户端上。
当您不希望通过网络为每个请求发送硬凭证(例如用户名和密码)时,基于令牌的身份验证方案非常有用。使用令牌时,硬凭证会被发送一次并交换必须在每个请求中发送的令牌。然后令牌成为凭证,并且可以在一段时间内有效。
请注意,您所使用的身份验证方案无关紧要,您的服务器需要验证每个请求中发送的凭据。
这是在RFC 7519中定义的双方之间安全地表示索赔的标准方法。 JWT是一个自包含令牌,使您能够在有效负载中存储用户标识符,到期日期和任何您想要的内容(但不存储密码),这是JSON编码为Base64。
客户端可以读取有效负载,并且可以通过验证服务器上的签名来轻松检查令牌的完整性。
要找到一些与JWT合作的优秀资源,请查看http://jwt.io。
JWT允许您执行无状态身份验证,也就是说,如果您不需要跟踪它们,则无需持久保存JWT令牌。
尽管如此,通过持久存在令牌,您将有可能使其无效并撤销其访问权限。要保持跟踪JWT令牌,而不是保留整个令牌,您可以保留令牌标识符(jti
声明)和一些元数据(您发出令牌的用户,到期日期等),如果您需要。
您的应用程序可以提供一些撤消令牌的功能,但在用户更改密码时始终考虑撤消令牌。
持久令牌时,请始终考虑删除旧令牌,以防止数据库无限期增长。