Мне нужна помощь в отправке пользовательской информации в объект session.user с использованием next-auth

Я пытаюсь добавить пользовательские данные в 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 };

Кто-то знает, как это исправить? Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проверьте обратный вызов 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;
  },
},

И эти обратные вызовы предоставят токен доступа клиенту.

Другие вопросы по теме