在RESTful API中存储身份验证令牌而不使用HTTP会话

在RESTful API中存储身份验证令牌而不使用HTTP会话,rest,Rest,我正在构建一个包含多个服务器的RESTful API,我想知道是否可以将访问令牌存储在中央数据库服务器中,然后针对每个请求,通过查询数据库并执行给定的操作来验证该访问令牌是否有效 如果我使用会话来完成这个任务,它会变成非RESTful的吗?比如,即使我将会话数据存储在数据库中?这么长时间以来,这对我来说是一个令人困惑的想法。您的RESTful API需要是无状态的。无状态意味着,它不应该依赖于先前的通信,就像在相关请求之前设置的身份验证和cookie一样 但是,这并不意味着您不能在服务器端缓存某

我正在构建一个包含多个服务器的RESTful API,我想知道是否可以将访问令牌存储在中央数据库服务器中,然后针对每个请求,通过查询数据库并执行给定的操作来验证该访问令牌是否有效


如果我使用会话来完成这个任务,它会变成非RESTful的吗?比如,即使我将会话数据存储在数据库中?这么长时间以来,这对我来说是一个令人困惑的想法。

您的RESTful API需要是无状态的。无状态意味着,它不应该依赖于先前的通信,就像在相关请求之前设置的身份验证和cookie一样

但是,这并不意味着您不能在服务器端缓存某些身份验证令牌,前提是客户端可以在没有它的情况下发出请求。这一切都意味着,如果客户机可以在每个请求上退回到标准HTTP身份验证,那么它应该仍然可以。这样做的目的是为了在服务器端实现负载平衡、分发和无(或有限)内存使用以进行会话

除此之外,如果你不打算使用它提供的好处,你并不需要遵循所有的“规则”。你可以,如果你想的话,以任何你想要的方式实现它,只要你知道折衷

编辑:找到以前关于以下主题的讨论:

REST是无状态的 REST代表代表代表性的状态转移,该架构由Roy Thomas Fielding在年定义

Fielding为REST体系结构定义了一组约束。其中一个限制是客户机和服务器之间的通信,定义如下(重点不在他的论文中):

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

因此,如果将会话状态保留在服务器上,则会中断会话。因此,这不是休息。在REST中,服务器上不会有会话,因此也不会有会话标识符

每个请求必须包含要处理的所有数据 从客户机到服务器的每个请求都必须包含服务器能够理解的所有必要信息。使用它,您不需要依赖服务器上存储的任何会话上下文

例如,当访问需要身份验证的受保护资源时,每个请求都必须包含所有需要正确身份验证/授权的数据。这意味着将对每个请求执行身份验证

请参阅以下关于新身份验证方案注意事项的引文:

HTTP身份验证框架的某些方面 对新身份验证方案的工作方式设置限制:

  • HTTP身份验证被认为是无状态的:所有 必须提供认证请求所需的信息 在请求中,而不是依赖于服务器 先前的请求。[……]
身份验证数据(凭据)应属于标准HTTP头。从:

授权
标题字段允许用户代理进行身份验证 它本身带有一个源服务器——通常,但不一定,在 接收到
401
(未经授权)响应。其价值包括 包含用户身份验证信息的凭据 正在请求的资源领域的代理

Authorization=凭证
[……]

请注意,此HTTP头的名称很不幸,因为它携带的是身份验证数据,而不是授权。无论如何,这是发送凭据的标准头

基于令牌的身份验证 执行基于令牌的身份验证时,令牌是您的凭据。在这种方法中,您的硬凭证(用户名和密码)被交换为在每个请求中发送的令牌。同样,必须对每个请求执行身份验证,这样您就不会利用服务器上存储的任何上下文

将令牌存储在服务器中的某个位置是完全有效的。而且它不会破坏REST架构的功能

代币 基本上,令牌可以是不透明的(除了值本身,它不会显示任何细节,比如随机字符串),也可以是自包含的(比如JSON Web令牌):

  • 随机字符串:可以通过生成随机字符串并将其持久化到具有过期日期和关联用户标识符的数据库来发布令牌

  • JSON Web令牌(JWT):由定义,它是一种标准方法,用于在双方之间安全地表示声明。JWT是一个自包含的令牌,允许您在有效负载中存储用户标识符、过期日期和任何您想要的内容(但不存储密码),有效负载是一个编码为的令牌。客户机可以读取有效负载,通过在服务器上验证令牌的签名,可以轻松检查令牌的完整性。如果不需要跟踪JWT令牌,则不需要持久化它们。尽管如此,通过持久化令牌,您将有可能使它们失效并撤销对它们的访问。要找到一些与JWT合作的好资源,请查看


在这里,您可以持久化您的令牌。根据您的需求,您可以探索不同的解决方案,例如,或。

REST上下文中的无状态意味着
从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。因此,会话状态完全保留在客户端上
。语句
不是很有效吗