Next.js 13中如何在NextAuth配置里动态设置session的maxAge
如何将客户端stayLogin复选框值传递到NextAuth的session配置中
客户端登录时传递的stayLogin复选框值无法直接在NextAuth配置的session.maxAge中动态设置,可通过以下步骤实现:
步骤1:在CredentialsProvider中接收并传递stayLogin
修改CredentialsProvider的authorize方法,从credentials参数中获取stayLogin,并将其附加到返回的用户对象中:
async authorize(credentials: any) { if (!credentials) return null const variables = { "email": credentials?.email, "password": credentials?.password, } try { const user = await graphQLMutationClient(signIn, variables) as User; // 将stayLogin附加到返回的user对象 return { ...user, stayLogin: credentials.stayLogin }; } catch (error: any) { throw new Error(error.response?.errors[0]?.message.replace(/\./g, "")); } return null }
步骤2:在JWT回调中动态设置token过期时间
在jwt回调内,根据stayLogin的值设置token的过期时间(示例:勾选时有效期7天,未勾选时2小时):
async jwt({ token, user }) { if (user) { const { stayLogin, ...restUser } = user; token.user = restUser; // 计算过期时间戳 const expiresIn = stayLogin ? 7 * 24 * 60 * 60 : 2 * 60 * 60; token.exp = Math.floor(Date.now() / 1000) + expiresIn; } return token; }
步骤3:调整session配置
由于JWT策略下,session的实际有效期由token的exp字段决定,因此可以移除session配置中的静态maxAge:
session: { strategy: 'jwt', // 移除静态maxAge,由token的exp动态控制有效期 },
可选:在session回调中传递stayLogin(若前端需要)
如果前端需要获取stayLogin状态,可在jwt回调中存入token,再在session回调中传递给session对象:
// jwt回调补充 token.stayLogin = user.stayLogin; // session回调修改 async session({ session, token }) { session.user.isLoggedIn = true; session.stayLogin = token.stayLogin; return session; }
内容的提问来源于stack exchange,提问作者Victor Parenyuk
相关产品推荐
相关产品推荐

