我正在构建一个使用JWT令牌进行用户身份验证的RESTful API(由login
端点发出,然后在所有标头中发送),并且需要在固定时间后刷新令牌(调用renew
端点,该端点将返回更新的令牌) )。
用户的API会话有可能在令牌到期之前变得无效,因此我的所有端点都首先检查以下各项:1)令牌仍然有效,以及2)用户会话仍然有效。由于客户端将令牌存储在本地,因此无法直接使令牌无效。
因此,我所有的端点必须向我的客户发出两种可能情况的信号:1)是时候续订令牌了; 2)会话已变为无效,并且不再允许它们访问系统。我可以想到两种替代方法,当两种情况之一发生时,我的端点可以向其客户端发出信号(假设客户端可以适应任一选项):
- 如果会话无效,则返回http 401代码(未经授权),或者在令牌到期且需要调用
renew
端点时返回412代码(前提条件失败),这将返回200(正常)代码。 - 返回401,表示会话无效或令牌已过期。在这种情况下,客户端将立即调用该
renew
端点,如果它返回200,则刷新令牌,但是如果renew
还返回401,则意味着该客户端不在系统之外。
您会推荐上述两种选择中的哪一种?哪一个会更标准,更容易理解和/或更RESTful?还是您会建议完全不同的方法?您发现这两种选择有明显的问题或安全隐患吗?如果您的答案包括支持您的观点的外部参考,则可以加分。
更新
伙计们,请关注一个真正的问题- 表示续订/会话无效的两个http代码替代方案中哪一个最好?不要介意我的系统使用JWT 和服务器端会话的事实,这是我的API针对非常特定的业务规则的特性,而不是我正在寻求帮助的部分;)