我在我的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;
},
},
});
有什么需要帮忙的吗?
1条答案
按热度按时间6tdlim6h1#
可能不是完全相同的情况,但这是我能找到的唯一一个类似问题的线程.我也得到了错误消息:“类型错误:无法读取未定义的属性“JWT”
导致它的原因是,我的后端将返回一个结构如下的登录响应:
我希望最终的next-auth session对象的结构如下:
但这就是我不断遇到问题的时候。我成功登录了,但每当焦点转移到它身上时,会话cookie就会立即消失。我把自己逼疯了,直到我开始重新构建会话对象。我最终决定使用 * 我的 * 不太理想的结构:
最后,它开始工作了。