Я пытаюсь добавить пользовательские данные в session.user, но это не работает. Странно то, что если я отправлю это:
const user = { id: '1', name: "J Smith", email: "[email protected]", };
Затем я получаю эту информацию на моей странице page.jsx с помощью useSession и печатаю ее в консоли:
const { data: session } = useSession(); console.info("in form session: ", session);
Но проблема в том, что когда я пытаюсь добавить пользователю пользовательскую информацию:
const user = { userId: res.data.data.login.userId, companyId: res.data.data.login.companyId, };
Он печатает пустой пользовательский объект без пользовательской информации, работает только тогда, когда я использую идентификатор, имя и адрес электронной почты.
Это мой полный код:
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import axios from "axios";
const handler = NextAuth({
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
email: {
label: "Email",
type: "email",
placeholder: "Enter your email",
},
password: { label: "Password", type: "password" },
},
async authorize(credentials, req) {
const res = await axios({
method: "POST",
url: `${process.env.NEXT_PUBLIC_AUTH_URL}/api`,
data: {
query: `
query Login($email: String!, $password: String!) {
login(email: $email, password: $password) {
userId
token
tokenExpiration
companyId
}
}
`,
variables: {
email: credentials.email,
password: credentials.password,
},
},
});
// Validation
if (res.data.errors) {
throw new Error(res.data.errors[0].message);
}
const user = {
userId: res.data.data.login.userId,
companyId: res.data.data.login.companyId,
};
if (user) {
return user;
}
// // Return null if user data could not be retrieved
return null;
},
}),
],
session: {
strategy: "jwt",
},
pages: {
signIn: "/login",
signOut: "/logout",
},
secret: process.env.NEXTAUTH_SECRET,
});
export { handler as GET, handler as POST };
Кто-то знает, как это исправить? Спасибо
Проверьте обратный вызов jwt, который получит пользователя от поставщика учетных данных, и обратный вызов сеанса, который предоставит данные, которые вам нужны в клиенте (например, useSession
)
Я уже исправил это, я публикую свой ответ здесь, возможно, это поможет кому-то в будущем. Мне не хватало обратного вызова jwt и сеанса, а также обратного вызова сеанса. Потому что next-auth по умолчанию не раскрывает все из соображений безопасности.
Добавление этого исправления:
callbacks: {
async jwt({ token, user }) {
// Persist the OAuth access_token to the token right after signin
if (user) {
token.accessToken = user.token;
}
return token;
},
async session({ session, token, user }) {
// Send properties to the client, like an access_token from a provider.
session.accessToken = token.accessToken;
return session;
},
},
И эти обратные вызовы предоставят токен доступа клиенту.