带有令牌的 Restful Web 服务是非标准的吗

Is Restfull webservice with token a non standard

我的申请流程是这样的:

  1. 客户端应用程序首先通过发送Username/Password请求令牌(令牌资源)
  2. 客户端应用程序将存储该令牌然后让用户登录(如果凭据有效)
  3. 现在客户端应用程序将使用令牌
  4. 执行剩余的api次调用
  5. 一旦用户注销,我们就会从客户端内存中删除令牌并使服务器令牌无效

在一次采访中有人问我这不是纯粹的 RestFull 标准,因为现在 你所有的资源都依赖于令牌资源,即在调用任何 api 客户端必须调用令牌 api,在这种情况下,资源中的耦合和顺序会变得紧密 。按照其余标准,所有资源都应该是独立的。

所以我的问题是:

1.有了token我的资源怎么独立?
2。使用token是非标准方式吗?那为什么很多应用都在使用token

一种方法是使用 基本身份验证 和 api 而不是令牌,但这样我将不得不在客户端应用程序中保存用户名和密码,直到它是 login.It 在客户端应用程序中保存密码不安全

快速浏览 REST 约束

老实说,只要应用程序不破坏 Roy Thomas Fielding 关于 REST 的论文 chapter 5 中定义的约束集,我就看不到令牌有任何问题:

我们来看看stateless constraint:

5.1.3 Stateless

[...] each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client. [...]

如果您正在访问需要身份验证的受保护资源,每个请求都必须包含所有必要的数据才能正确authenticated/authorized,在客户端保持会话状态。

当您不想通过网络为每个请求发送用户名和密码等硬凭据时,基于令牌的身份验证方案非常有用。使用令牌时,硬凭证发送一次并交换必须在每个请求中发送的令牌。那么token就成为凭证,可以在一定时间内有效。

请注意,无论您选择哪种身份验证方案,您的服务器都需要验证每个请求中发送的凭据。

JSON 网络令牌 (JWT)

这是在 RFC 7519. JWT is a self-contained token and enables you to store a user identifier, an expiration date and whatever you want (but don't store passwords) in a payload, which is a JSON encoded as Base64.

中定义的两方之间安全声明的标准方法

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

要找到一些使用 JWT 的重要资源,请查看 http://jwt.io

跟踪代币

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

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

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

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