我在我的 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;
},
},
});
请问有什么帮助吗?
可能不是完全相同的情况,但这是我能找到的具有类似问题的唯一线程。我还收到错误消息:“TypeError:无法读取未定义的属性‘JWT’”
导致它的是我的后端将返回如下结构的登录响应:
{ user: {}, jwt: "string" }
我希望构建最终的下一个身份验证会话对象,例如:
session = { expires, jwt: "string", user: {} }
但就在那时我不断遇到这个问题。我可以成功登录,但是每当焦点移开然后又返回时,会话 cookie 就会立即消失。我快把自己逼疯了,直到我开始重组会话对象。我最终决定采用我的不太理想的结构:
session = { expires, user: { ...user, jwt: "string" } }
最后,它开始工作了。
我遇到了相反的问题,在本地设备中一切正常,但在生产中,当我刷新或更改路由时,它会丢失网络选项卡上的“会话”条目,迫使用户再次登录。