javascript 下一个身份验证会话在开发环境中消失数据

tcomlyy6  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(119)

我在我的next.js项目中使用了next auth,但是在开发过程中,如果服务器刷新,那么会话会立即丢失其中的数据,如果我在浏览器中更改到另一个选项卡,然后返回到它,会话会丢失其数据,我将被迫注销,然后登录,让它再次工作。这在生产模式下不会发生。下面是[...nextauth].js文件代码:

import NextAuth from "next-auth/next";
import GoogleProvider from "next-auth/providers/google";
import CredentialsProvider from "next-auth/providers/credentials";
import axios from "axios";
let userInfo = {};
export default NextAuth({
  site: process.env.SITE,
  providers: [
    CredentialsProvider({
      name: "Credentials",
      async authorize(credentials, req) {
        let status;
        let user = {};
        let message = ''
        await axios
          .post(
            `${process.env.NEXT_PUBLIC_DOMAIN_URL}/app/auth`,
            { userName: credentials.username.replace(/\s/g, ''), pwd: credentials.password },
            {
              headers: { "Content-Type": "application/json" },
              withCredentials: true,
            }
          )
          .then(function (response) {
            if (response?.data) {
              user = { ...response.data };
              userInfo = user;
            }
          })
          .catch((error) => {
            if (error.response) {
              throw new Error(JSON.stringify({ errors: error?.response?.data?.message, status: false }))
            } else if (error.request) {
              throw new Error(JSON.stringify({ errors: 'Server error, please try again.', status: false }))

            } else {
            
              throw new Error(JSON.stringify({ errors: 'Network error, please try again.', status: false }))

            }
          });
        return user;
      },
    }),

  ],
  pages: {
    signIn: "/Auth/Login",
  },
  session: {
    jwt: true,
    strategy: "jwt"
  },
  jwt: {
   
    maxAge: 60 * 60 * 24 * 30 * 6,
  },
  secret: process.env.NEXT_AUTH_SECRET,

  callbacks: {
    async jwt({ token, user, account, profile, isNewUser }) {
      user && (token = { ...token, ...user });
      return token;
    },
    async session({ session, token }) {
      if (token) {
        session.user = { ...userInfo };
      }

      return session;
    },
  },
});

有什么需要帮忙的吗?

6tdlim6h

6tdlim6h1#

可能不是完全相同的情况,但这是我能找到的唯一一个类似问题的线程.我也得到了错误消息:“类型错误:无法读取未定义的属性“JWT”
导致它的原因是,我的后端将返回一个结构如下的登录响应:

{ user: {}, jwt: "string" }

我希望最终的next-auth session对象的结构如下:

session = { expires, jwt: "string", user: {} }

但这就是我不断遇到问题的时候。我成功登录了,但每当焦点转移到它身上时,会话cookie就会立即消失。我把自己逼疯了,直到我开始重新构建会话对象。我最终决定使用 * 我的 * 不太理想的结构:

session = { expires, user: { ...user, jwt: "string" } }

最后,它开始工作了。

相关问题