JWT 过期时间的最佳实践是 15 分钟左右。
使用 Nextauth.js (4.17.0) 我注意到,尽管设置了 MaxAge 属性,会话令牌看起来只是设置了过期时间,但最终当我解码 Base64 令牌时,它并没有过期(!!!我可以复制令牌并使用它随时从 BE 获取数据)。
当我尝试将 expiresIn 设置为 jwt.SignOptions 的一部分时
const jwtCallback = {
encode: async ({ secret, token }) => jwt.sign(token, secret, { algorithm: 'HS512', expiresIn:'Whenever' }),
我明白了
Error: Bad "options.expiresIn" option the payload already has an "exp" property.
此外,我想定期重新生成令牌,因此一旦它过期,我就已经在使用另一个令牌了。为此,我尝试为会话回调设置不同的属性,例如
keepAlive, clientMaxAge, maxAge
但没有结果。
我也在这里看到https://github.com/nextauthjs/next-auth/issues/5652和https://github.com/nextauthjs/next-auth/issues/796 很多评论中人们也同样为此苦苦挣扎。
仅当我在 JWT 回调期间添加 JWT 令牌时,为我设置 JWT 令牌的过期时间才有效:
async jwt({ token, profile }) {
...
token.exp = Math.round(Date.now() / 1000) + JWT_TOKEN_EXPIRES_IN_SECONDS;
...
return token;
重新生成新的 JWT 令牌可以通过设置
refetchInterval
组件的 SessionProvider
来实现,如下所示:
<SessionProvider refetchInterval={JWT_TOKEN_REFETCH_INTERVAL_SECONDS}>
注意(也使用最新的 next-auth 4.24.7):当窗口在两分钟/几次重新获取后在 Chrome 中失去焦点时
refetchInterval
被库更改为 60 秒,尽管用户设置