Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
REST定义——一旦系统提供了用户授权,它就不是RESTful系统了吗?_Rest - Fatal编程技术网

REST定义——一旦系统提供了用户授权,它就不是RESTful系统了吗?

REST定义——一旦系统提供了用户授权,它就不是RESTful系统了吗?,rest,Rest,我开始读一些关于RESTful系统的书,并开始学习。它在第7-8页上说,RESTful系统有以下限制: 它必须是客户机-服务器系统 它必须是无状态的,服务不需要保持用户会话;换句话说,每个请求都应该是 独立于其他RESTful架构 它必须支持缓存系统。网络基础设施应支持不同级别的缓存 它必须是统一可访问的,每个资源必须具有唯一的地址和有效的访问点 它必须分层,并且必须支持可伸缩性 它应该按需提供代码尽管这是一个可选约束,但应用程序可以在运行时通过允许 按需下载代码,例如Java小程序 现在有

我开始读一些关于RESTful系统的书,并开始学习。它在第7-8页上说,RESTful系统有以下限制:

  • 它必须是客户机-服务器系统
  • 它必须是无状态的,服务不需要保持用户会话;换句话说,每个请求都应该是 独立于其他RESTful架构
  • 它必须支持缓存系统。网络基础设施应支持不同级别的缓存
  • 它必须是统一可访问的,每个资源必须具有唯一的地址和有效的访问点
  • 它必须分层,并且必须支持可伸缩性
  • 它应该按需提供代码尽管这是一个可选约束,但应用程序可以在运行时通过允许 按需下载代码,例如Java小程序
现在有第2点说不需要保持用户的会话。这对我来说意味着,每个提供登录系统的应用程序都不是RESTful系统(根据定义),因为我需要保留(例如)一个用户令牌,以便在API上作为允许访问此资源的用户进行身份验证


然而,我无法想象每个RESTful系统都不支持任何安全标准,例如授权。我是否理解错误,或者任何支持授权的系统都不是RESTful系统。

身份验证不需要有状态API

作为一个稻草人例子,考虑一个具有:

的应用程序。
  • 包含硬编码用户名和密码的配置文件
  • 一种请求格式,包括每个请求中的用户名和密码
  • 每当收到请求时运行的逻辑,并将请求与配置文件进行比较
该系统可以在完全只读的系统上运行,根本不存储任何状态;然而,很明显,它有身份验证

如果我们将用户名和密码移动到数据库,应用程序仍然是无状态的——它只需要读取该数据库,而不需要写入该数据库。类似地,我们可以传输密码的散列加一个nonce而不是明文密码,支持具有不同权限的多个用户,等等,并且我们没有引入状态性

如果引入一个令牌系统,比如OAuth,其中用户请求一个令牌一次,并将其用于后续请求,而不是发送其完整凭据,那么您就可能引入状态—存储有效令牌并在每个请求上检查它。然而,这并不一定是真的-您可以生成一个自包含的令牌,用户可以使用该令牌在固定的时间长度内证明自己是谁,使用加密签名来阻止伪造,而不必在中央数据库中进行检查;这就是JWT(JSON Web令牌)的工作原理。重要的是,这不是会话令牌-用户应该可以自由地使用相同的令牌或一系列新令牌执行一系列请求,而不会影响结果


重要的一点是,请求的行为应该仅取决于该请求。一个有状态的API会说“产品#1将意味着不同的东西,这取决于您提供的会话令牌”;或者“您必须在请求Y之前调用请求X,我们将使用会话令牌跟踪您是否已这样做”。在无状态API中,您会说“您必须提供一个有效的产品ID来请求Y,您如何获得它取决于您自己,但您可能会通过调用请求X来获得它。”

Does,“产品#1的含义会有所不同,这取决于您提供的会话令牌“是否需要有状态?”?它需要分支逻辑;但是,一个无状态JWT代币的工作方式是否与前一段中的工作方式相同?@jaco0646否,因为同一用户的两个JWT代币应该是等效的,所以您不需要记住搜索产品时使用的代币来购买这些产品。也许认证和会话之间的区别应该更清楚。