是Restfull webservice,令牌是非标准的

时间:2017-02-07 13:40:52

标签: web-services rest restful-authentication restful-architecture webservice-client

我的申请流程如下:

  1. 客户端应用程序首先通过发送用户名/密码请求令牌(令牌资源)
  2. 客户端应用程序将存储该令牌,然后让用户登录(如果凭据有效)
  3. 现在,客户端应用程序将使用令牌
  4. 执行剩余的api调用
  5. 一旦用户注销,我们就会从客户端内存中删除令牌并使服务器中的令牌无效
  6. 在一次采访中我被问到这不是一个纯粹的RestFull 标准,因为现在所有资源都依赖于令牌资源,即在调用任何api客户端之前必须调用token api并且在这种情况下,资源将成为紧密耦合和排序。根据其他标准,所有资源都应该是独立的。

    所以我的问题是:

    1。使用令牌,我的资源如何变得独立?
    2。使用令牌是非标准方式吗?那么为什么很多应用程序都使用令牌。

    一种方法是使用api而不是令牌使用基本身份验证,但这样我必须在客户端应用程序中保留商店用户名和密码,直到登录为止。不安全在客户端应用程序中保存密码

1 个答案:

答案 0 :(得分:1)

快速查看REST约束

老实说,如果应用程序没有破坏Roy Thomas Fielding关于REST的论文chapter 5中定义的约束集,我认为令牌没有任何问题:

我们来看看stateless constraint

  

5.1.3 Stateless

     

[...]从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。 [...]

如果您要访问需要身份验证的受保护资源,则每个请求都必须包含所有必要的数据才能进行正确身份验证/授权,从而将会话状态保留在客户端上。

当您不希望通过网络为每个请求发送硬凭证(例如用户名和密码)时,基于令牌的身份验证方案非常有用。使用令牌时,硬凭证会被发送一次并交换必须在每个请求中发送的令牌。然后令牌成为凭证,并且可以在一段时间内有效。

请注意,您所使用的身份验证方案无关紧要,您的服务器需要验证每个请求中发送的凭据。

JSON Web令牌(JWT)

这是在RFC 7519中定义的双方之间安全地表示索赔的标准方法。 JWT是一个自包含令牌,使您能够在有效负载中存储用户标识符,到期日期和任何您想要的内容(但不存储密码),这是JSON编码为Base64

客户端可以读取有效负载,并且可以通过验证服务器上的签名来轻松检查令牌的完整性。

要找到一些与JWT合作的优秀资源,请查看http://jwt.io

保持令牌的跟踪

JWT允许您执行无状态身份验证,也就是说,如果您不需要跟踪它们,则无需持久保存JWT令牌。

尽管如此,通过持久存在令牌,您将有可能使其无效并撤销其访问权限。要保持跟踪JWT令牌,而不是保留整个令牌,您可以保留令牌标识符(jti声明)和一些元数据(您发出令牌的用户,到期日期等),如果您需要。

您的应用程序可以提供一些撤消令牌的功能,但在用户更改密码时始终考虑撤消令牌。

持久令牌时,请始终考虑删除旧令牌,以防止数据库无限期增长。