Задать вопрос
Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Правильно ли выполнять HTTP-запрос для получения профиля в callback session?

У нас есть проект, созданный с помощью React, Next.js и бэкенда Laravel.

Мы используем четыре поставщика аутентификации: CredentialsProvider, YandexProvider, VkProvider и MailRuProvider.

Считается ли хорошей практикой делать запрос к бэкенду Laravel в обратном вызове session для получения данных профиля пользователя?
Мы заметили, что есть частые запросы к /session, и каждый обратный вызов, похоже, запускает дополнительные запросы.
next-auth = ^5.0.0-beta.29
Вот фрагмент кода, показывающий HTTP-запросы:
export const { handlers, signIn, signOut, auth } = NextAuth({
  trustHost: true,
  providers: [
    YandexProvider({/* code */}),
    VkProvider({/* code */}),
  ],
  callbacks: {
    async jwt({ token, user, account, profile, trigger, session }) {
      if (account?.provider === 'yandex') {
        const email = profile.emails[0]
        const data = await check({ email: email })
        if (!data.data.user_exist) {
          const user = {
            // ... fill props
          }
          const data = await register(user)
          if (data) {
            const { user, token: access_token, refresh_token } = data.data
            token.user = {
              // ... fill props
            }
	    // save token for get profile
            token.token = access_token
            token.refreshToken = refresh_token
          }
        } else {
          const user = {
             // ... fill props
          }
          const data = await login(user)
          if (data) {
            const { user, token: access_token, refresh_token } = data.data
            token.user = {
              // ... fill props
            }
            // save token for get profile
            token.token = access_token
            token.refreshToken = refresh_token
          }
        }
      }
      return token
    },
    async session({ session, token, user }) {
      const access_token = token.token
      const refresh_token = token.refreshToken
      if (token) {
        const response = await fetch(
          `${process.env.NEXT_PUBLIC_API_URL}/profile`,
          {
            method: 'GET',
            headers: {
              Authorization: 'Bearer ' + access_token,
              'Content-Type': 'application/json'
            }
          }
        )
        if (!response.ok) {
          throw new Error('Network response was not ok ' + response.statusText)
        }
        session.user = {
          // ... code
          // access_token from jwt callback
          accessToken: access_token,
          refreshToken: refresh_token
        }
      }
      return session
    }
  },
})
  • Вопрос задан
  • 22 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы