我想对我们的新REST API实施基于JWT的身份验证。但是,由于在令牌中设置了有效期,是否可以自动延长有效期?我不希望用户在此期间正在使用该应用程序的情况下,每隔X分钟登录一次。那将是巨大的用户体验失败。
但是,延长有效期将创建一个新令牌(旧令牌在过期之前仍然有效)。在每个请求之后生成一个新令牌对我来说听起来很愚蠢。当多个令牌同时有效时,听起来像一个安全问题。当然,我可以使用黑名单来使旧的使用过的无效,但我需要存储令牌。JWT的好处之一是无需存储。
我发现Auth0如何解决它。它们不仅使用JWT令牌,而且还使用刷新令牌:https : //docs.auth0.com/refresh-token
但是同样,要实现此功能(不使用Auth0),我需要存储刷新令牌并保持其过期。那么,真正的好处是什么?为什么不只有一个令牌(而不是JWT)并在服务器上保留到期时间?
还有其他选择吗?使用JWT是否不适合这种情况?
我通过在令牌数据中添加变量来解决此问题:
我将
expiresIn
选项设置为所需的时间,然后用户将被迫再次登录。我的设定为30分钟。该值必须大于的值softexp
。当我的客户端应用向服务器API发送请求时(需要令牌,例如,客户列表页面),服务器会根据其原始到期(
expiresIn
)值检查提交的令牌是否仍然有效。如果无效,服务器将以特定于此错误的状态响应,例如。INVALID_TOKEN
。如果令牌基于
expiredIn
值仍然有效,但已超过该softexp
值,则服务器将针对此错误以单独的状态响应,例如。EXPIRED_TOKEN
:在客户端,如果收到
EXPIRED_TOKEN
响应,它应该通过向服务器发送续订请求来自动续订令牌。这对用户是透明的,并会自动处理客户端应用程序。服务器中的续订方法必须检查令牌是否仍然有效:
如果上述方法失败,服务器将拒绝续订令牌。