在 Nextauth.js 中设置过期并自动刷新 JWT 令牌

问题描述 投票:0回答:1

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/5652https://github.com/nextauthjs/next-auth/issues/796 很多评论中人们也同样为此苦苦挣扎。

security callback jwt next-auth express-jwt
1个回答
0
投票

仅当我在 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 秒,尽管用户设置

© www.soinside.com 2019 - 2024. All rights reserved.