如何在nextjs auth中1小时后自动使会话过期?

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

我尝试在 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”属性已正确填充。出于安全原因我省略了它。

next.js next-auth
2个回答
0
投票

我有同样的要求,并且我已经能够通过在会话中的用户对象中设置不同的密钥(因为我在用户会话中也需要这个)而不是“过期”来实现这一点,因为 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;
  }
}

0
投票

我设法获取会话的过期时间,您需要像这样在处理程序中使用会话选项

 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;
     }
 }

在这种情况下,我必须设置与后端生成的令牌相同的时间,如果后端更改时间并且前端未更新,则可能会有所不同,但我找不到另一种方法来保持这两个同步

希望这对您有帮助

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