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

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

我在我的 next.js 项目中使用 next auth, 但在开发过程中,如果服务器刷新,那么 sessio 会立即丢失其中的数据,而且如果我更改到浏览器中的另一个选项卡然后返回到它,会话会丢失其数据,然后我将被迫退出登录以使其再次运行。 这在生产模式下不会发生。 下面是

[...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;
    },
  },
});

请问有什么帮助吗?

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

可能不是完全相同的情况,但这是我能找到的具有类似问题的唯一线程。我还收到错误消息:“TypeError:无法读取未定义的属性‘JWT’”

导致它的是我的后端将返回如下结构的登录响应:

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

我希望构建最终的下一个身份验证会话对象,例如:

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

但就在那时我不断遇到这个问题。我可以成功登录,但是每当焦点移开然后又返回时,会话 cookie 就会立即消失。我快把自己逼疯了,直到我开始重组会话对象。我最终决定采用我的不太理想的结构:

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

最后,它开始工作了。


0
投票

我遇到了相反的问题,在本地设备中一切正常,但在生产中,当我刷新或更改路由时,它会丢失网络选项卡上的“会话”条目,迫使用户再次登录。

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