Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
是";注销“;在RESTAPI上没用?_Rest_Logout_Jwt_Api Design - Fatal编程技术网

是";注销“;在RESTAPI上没用?

是";注销“;在RESTAPI上没用?,rest,logout,jwt,api-design,Rest,Logout,Jwt,Api Design,考虑到,根据定义,RESTAPI是无状态的:“注销”操作没用吗 我的意思是,我正在使用加密的JWT创建一个RESTAPI。每个令牌都有一个到期时间,比如说,60分钟。如果我将API生成的最后一个令牌保存在数据库表中,“注销”将从有效令牌表中删除它们。但是,如果我这样做,我知道API将不再是无状态的,对吗? 所以,我明白我不应该那样做。我认为唯一的解决方案是将JWT过期时间缩短到5分钟,不要实现“注销”操作,只让令牌过期 这是正确的方法吗?我认为您的API已经是有状态的,仅仅是因为您有一个令牌。我

考虑到,根据定义,RESTAPI是无状态的:“注销”操作没用吗

我的意思是,我正在使用加密的JWT创建一个RESTAPI。每个令牌都有一个到期时间,比如说,60分钟。如果我将API生成的最后一个令牌保存在数据库表中,“注销”将从有效令牌表中删除它们。但是,如果我这样做,我知道API将不再是无状态的,对吗?

所以,我明白我不应该那样做。我认为唯一的解决方案是将JWT过期时间缩短到5分钟,不要实现“注销”操作,只让令牌过期


这是正确的方法吗?

我认为您的API已经是有状态的,仅仅是因为您有一个令牌。我也不会太在意REST的纯洁性,这意味着无论遇到什么情况,一切都必须是无状态的

简单地说,如果您的应用程序需要登录,那么您需要一种注销方式。您不能实现短期到期,因为对于API的消费者来说,这将是一种非常烦人的体验。你不能完全不注销,因为这是一个潜在的安全缺陷

我支持一个类似的RESTAPI,并且实现了一个作为删除调用的注销端点。它只是删除服务器端的令牌信息,并清除登录用户的任何类型的身份验证

TL;博士


不,注销在RESTAPI中不是无用的。事实上,对于需要身份验证的API,这或多或少是必要的。

自动令牌过期是与显式“注销”机制不同的问题,因此,无论您的API是否为ReSTful,它们都是完全有效的操作

当用户注销时,他们会有意识地决定使其访问令牌失效——例如,如果他们正在使用公共计算机或临时借用他人的设备

自动到期用于确保用户必须以某种方式定期重新验证。这有利于服务器端安全

访问令牌与在客户端和服务器之间共享会话状态无关——完全可以在没有共享状态的情况下实现访问令牌系统,并且令牌本身不实现会话状态,它仅用于验证用户是否是他们声称的用户。因此,访问令牌实际上与API的状态无关

我的意思是,我正在使用加密的JWT创建一个RESTAPI

JSON Web令牌(JWT)令牌将有关授权的所有数据编码到令牌本身中。这种方法最重要的优点是,您根本不需要令牌存储的后端存储。一个缺点是,您不能轻松地撤销访问令牌,因此它们通常在短期到期时被授予,并且撤销在刷新令牌处处理。另一个缺点是,如果在令牌中存储了大量用户凭据信息,则令牌可能会变得相当大。因此,如果:

如果我将API生成的最后标记保存在数据库表中, “注销”操作将从有效列表中删除它们 代币

那么你就失去了使用JWT最重要的优势,而且,仍然有所有这些缺点,这在我看来是不合理的

所以,我明白我不应该那样做。我唯一的解决办法是 我们的想法是将JWT的过期时间缩短到5分钟,不要这样做 实现“注销”操作,让令牌过期

这是正确的方法吗

在我看来,如果你打算使用JWT,是的!最好依靠令牌到期。有关此方法的更多详细信息,请查看

在RESTAPI上“注销”是无用的吗


不管您使用的是JWT,还是类似于计算机科学上任何其他像样的问题,答案都是这要视情况而定。无状态最重要的优点是,API的可伸缩性更强。如果选择此路径,则可能应该对API上的每个请求进行身份验证,因为您可能需要在后端存储中搜索给定的令牌或解码JWT令牌。因此,在这种情况下,在单个节点上可能会有一些性能成本,但从总体上看,您仍然具有可伸缩性。我想我想说的是,如果您不需要这种可伸缩性,最好选择有状态的方法。否则,纯粹的REST原则就是最好的选择。

您可以生成一个已经过期的新令牌,即过期时间为1秒。并将其传递给用户。任何即将到来的请求都将无效。但这不是最佳解决方案。

我认为这取决于您希望应用程序的行为,以及您需要它的安全程度。您真的需要使令牌无效吗? 例如,您可以从前端(浏览器或应用程序)删除您的令牌。从理论上讲,它是唯一一个储存特定代币的地方。但是,如果令牌被破坏,它在到期之前仍然有效

如果您真的需要使it服务器端失效,一种常见的方法是使用令牌创建一个黑名单,并不时清除过期的条目

但是,如果您需要应用程序为每个用户只接受一个令牌,比如在一个银行应用程序中,您一次只能登录一个设备,该怎么办?为此,黑名单不会执行此任务,因此您需要为每个用户存储一个令牌,并检查传递的令牌是否相同。注销时,您只需清除该唯一条目。或者,您可以只使用会话


因此,它不是无用的,只是取决于您的应用程序。

由于令牌的过期时间较短,我认为对于大多数应用程序来说,在注销时从客户端删除令牌将是一个很好的解决方案。任何更多的都将依赖于服务器,不再是无状态的