我有一个基于Koa的Node.js后端,用于我的个人/业余应用程序。
我使用JWT令牌实现会话管理。客户端(AngularJS)在成功登录后获取令牌并将其存储在某个地方(目前在sessionStorage
中,但对于本问题而言,这不重要)。
我有两个问题:
当我需要更新JWT所代表的用户记录时,例如,用户打开了双因素身份验证(2FA),所以我要求他提供手机号码,并将此电话号码设置在用户记录中。当前,在电话号码成功验证后,我调用我的后端来更新用户记录,并创建一个具有更新后的用户记录的新JWT令牌(我从JWT令牌中排除敏感信息,如哈希密码,但我想包括电话号码以供客户端使用)。更改凭据时创建新令牌并使用此新令牌更新现有客户端令牌是否可以?我应该永远不要创建另一个令牌,只有在成功认证时才创建唯一的令牌吗?那我如何更新令牌中的有效负载?
我应该如何处理过期的JWT令牌?在我的脑海中,我有3种(可能的)情况:
2.1. JWT被设置为短暂的,例如15分钟。如果后端服务器回复401未经授权'无效令牌'(我猜这是koa-jwt
的默认行为),那么我会自动注销我的客户端并要求重新认证。但我还设置了一个补充中间件,在后端链中是最后一个,以重新创建具有刷新过期时间的令牌,并且客户端也将用刷新后的令牌替换现有令牌。因此,如果用户活跃并在每个受保护的API调用时使用应用程序,则在成功情况下,将创建新令牌以替换旧令牌。
2.2. JWT被设置为长期存在,例如1周,如果过期,我选择从客户端进行重新认证。
2.3. 复制https://www.rfc-editor.org/rfc/rfc6749#section-1.5。在成功进行身份验证后创建JWT令牌时,我们发送一个access_token以及一个refresh_token。当access_token过期且服务器响应HTTP 401'invalid token' (koa-jwt
默认)时,客户端会将refresh_token发送到后端请求一个新的access_token(和可选的新refresh_token)。在这种情况下,我不太明白如何针对旧的access_token验证refresh_token以提供一个新的token?或者为什么我们需要有一个refresh_token?
任何关于JWT更新和JWT过期的通用建议都会很有帮助。