我尝试在 1 小时后自动使会话过期,但没有成功。
目前,我正在尝试基于后端 JWT 令牌在会话回调中设置自定义 session.expires :
async session({ session, token }) {
const userId = token.sub
const user = [...logic to populate the 'user' variable]
session.accessToken = token.accessToken as string
const payload: { exp: number } = jwt_decode(session.accessToken as string)
session.user = user
session.expires = new Date(payload.exp * 1000).toISOString()
return session
},
如果我在登录后保持浏览器窗口打开,1小时后用户似乎断开连接,因为您可以看到从端点“/api/auth/session”接收的对象是空的,但是,当重新加载页面时,会话是重新填充过去的过期属性。
{
"user":{},
"expires":"2022-05-19T07:21:07.000Z",
"accessToken":"ACCESS_TOKEN_GOES_HERE"}
PS:“user”和“accessToken”属性已正确填充。出于安全原因我省略了它。
我有同样的要求,并且我已经能够通过在会话中的用户对象中设置不同的密钥(因为我在用户会话中也需要这个)而不是“过期”来实现这一点,因为 nextAuth 会自动轮换刷新页面时
expires
键的值。
在
session
文件中的 NextAuth [...nextauth].ts
回调中设置会话过期值,如下所示。
callbacks: {
....
async session({ session, token }) {
session.user = token.user;
if (!session.user.session_expiry) {
// set expiration to 12 hours for now
const exp = new Date(new Date().getTime() + 12*60*60*1000).toISOString();
session.user.session_expiry = exp;
}
return session;
},
}
...
在您的客户端代码中,您需要检查此到期时间并调用 nextAuth 的注销方法。
const { status, data: sessionData } = useSession();
const { user: { session_expiry: sessionExpiry = null } = {} } =
sessionData || {};
useEffect(() => {
const isSiteSessionExpired = sessionExpiry || new Date(sessionExpiry) < new Date();
if (status === "authenticated" && isSiteSessionExpired) {
signOut();
}
}, [sessionExpiry, status]);
如果会话已过期,这将强制用户注销。
奖励:如果您使用打字稿,请使用以下代码对 session_expiry 变量进行类型检查。
import { type DefaultSession } from "next-auth";
type UserWithSessionExpiry = {
session_expiry?: string;
} & DefaultSession["user"];
declare module "next-auth" {
interface Session {
user: UserWithSessionExpiry;
}
}
我设法获取会话的过期时间,您需要像这样在处理程序中使用会话选项
session: {
maxAge: 5
},
jwt: {
maxAge: 5
},
callbacks: {
async jwt({ token, user}) {
return { ...token, ...user};
},
async session({ session, token}) {
session.user = token as any;
return session;
}
}
在这种情况下,我必须设置与后端生成的令牌相同的时间,如果后端更改时间并且前端未更新,则可能会有所不同,但我找不到另一种方法来保持这两个同步
希望这对您有帮助