Как связать next-auth с back-end?

Как правильно реализовать авторизацию в NextJS и отправлять запросы на бэкэнд после успешной авторизации через Google? Когда пользователь авторизуется через Google, мы получаем сессию с помощью useSession и получаем необходимые данные на фронтенде. Как сохранить этого пользователя в базе данных на бэкэнде? Как отправлять запросы на получение постов пользователя? Возникает вопрос о доступе к access- и refresh-токенам, которые, похоже, не приходят. После авторизации получаем имя пользователя и другую информацию в data. Но что делать с бэкэндом дальше? Какие данные и в каком формате нужно передавать, чтобы бэкэнд понял, какую информацию и для кого нужно передать мне?
  • 18 сентября 2023 г. 10:27
Ответы на вопрос 5
Для связывания next-auth с вашим бэкэндом, вам понадобится настроить адаптер для вашей базы данных и конфигурацию обратного вызова для обработки и сохранения пользователей в вашей базе данных.

Вот шаги, которые можно выполнить для реализации авторизации через Google и отправки запросов на ваш бэкэнд:

1. Установите необходимые пакеты:
   ```
   npm install next-auth
   npm install mongodb # пример для MongoDB, выберите соответствующий адаптер для вашей базы данных
   ```

2. Создайте файл `pages/api/auth/[...nextauth].js` и добавьте следующий код:
  ```javascript
  import NextAuth from 'next-auth'
  import Providers from 'next-auth/providers'
  import { connectToDatabase } from '../../../utils/db' // Подключение к вашей базе данных

  export default NextAuth({
    // Конфигурация провайдеров авторизации
    providers: [
      Providers.Google({
        clientId: process.env.GOOGLE_CLIENT_ID,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET
      })
    ],
    
    // Конфигурация адаптера базы данных
    adapter: Adapters.MongoDB.Adapter({ db: await connectToDatabase() }),
    
    // Настройка редиректа после успешной авторизации
    callbacks: {
      async signIn(user, account, profile) {
        if (account.provider === 'google') {
          // Сохранение дополнительных данных пользователя в базе данных на бэкэнде
          // используйте user.email и другие свойства для отправки запроса к вашему бэкэнду
        }
        
        return true
      }
    }
  })
  ```

3. Создайте файл `utils/db.js` и добавьте код для подключения к вашей базе данных (в примере - MongoDB):
  ```javascript
  import { MongoClient } from 'mongodb'

  export async function connectToDatabase() {
    const client = await MongoClient.connect(process.env.MONGODB_URI)
    
    return client.db()
  }
  ```

4. Создайте компонент, который будет вызывать `useSession` и отправлять запросы на ваш бэкэнд после успешной авторизации. Например:
  ```javascript
  import { signIn, useSession } from 'next-auth/client'

  export default function Profile() {
    const [session, loading] = useSession()

    const handleGetPosts = async () => {
      const response = await fetch('/api/posts', {
        headers: {
          // Передача access-токена в заголовке запроса
          Authorization: `Bearer ${session.accessToken}`
        }
      })

      const data = await response.json()
      console.log(data)
    }

    if (session) {
      return (
        <div>
          <h1>Welcome, {session.user.name}</h1>
          <button onClick={handleGetPosts}>Get Posts</button>
        </div>
      )
    }

    return (
      <div>
        <h1>Please sign in</h1>
        <button onClick={() => signIn('google')}>Sign in with Google</button>
      </div>
    )
  }
  ```

Дополнительно, вы можете настроить серверную аутентификацию на вашем бэкэнд, чтобы проверять доступ и возвращать данные пользователю.

Важно отметить, что вам также потребуется настроить интеграцию с конкретным провайдером (например, Google), чтобы получить access- и refresh-токены. Обычно, при успешной аутентификации с провайдером, NextAuth будет автоматически сохранять и использовать токены для вас.

Проверьте документацию next-auth и документацию провайдера, который вы хотите использовать, для получения дополнительной информации и конкретных сведений о том, как настроить связь с вашим бэкэндом.
https://dev.to/ifennamonanu/building-google-jwt-au... 
 https://github.com/mehmetpekcan/nextjs-13-jwt-auth... 
 https://refine.dev/blog/nextauth-google-github-aut... 
 https://codevoweb.com/jwt-authentication-in-nextjs...

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