Як реалізувати аутентифікацію за допомогою NextAuth у Next.js 15 та TypeScript

pic

Вступ

У цій статті ми розглянемо процес впровадження NextAuth для аутентифікації в проєкті Next.js 15 з використанням TypeScript. NextAuth — це чудова бібліотека для додавання аутентифікації в вашому додатку Next.js, і ми покажемо, як налаштувати її за допомогою CredentialsProvider (вхід через email/пароль) і інтегрувати в ваш проєкт крок за кроком.

Необхідні попередні налаштування

Перед тим як почати, переконайтесь, що у вас налаштовано:

  • Проєкт Next.js 15 з TypeScript.
  • Налаштований Prisma для роботи з базою даних.
  • Базові знання про те, як працюють Next.js та TypeScript.

Крок 1: Встановлення залежностей

Спочатку встановіть необхідні залежності для NextAuth та Prisma:

npm install next-auth bcryptjs prisma @prisma/client

Крок 2: Налаштування Prisma

Якщо ви ще не налаштували Prisma у своєму проєкті, потрібно це зробити. Створіть файл schema.prisma в папці prisma, якщо його ще немає, і визначте модель User ось так:

// schema.prisma  
model User {  
 id Int @id @default(autoincrement())  
 email String @unique  
 password String  
 firstName String  
 lastName String  
 phone String  
}

Далі виконайте команду для генерації клієнта Prisma:

npx prisma generate

Крок 3: Налаштування NextAuth у вашому проєкті

Тепер налаштуємо NextAuth у вашому проєкті. Створіть файл під назвою route.ts у папці app/api/auth/[...nextauth] і налаштуйте його ось так:

// app/api/auth/[...nextauth]/route.ts  
import NextAuth from 'next-auth'  
import CredentialsProvider from 'next-auth/providers/credentials'  
import bcrypt from 'bcryptjs'  
import prisma from '@/lib/db' // Переконайтесь, що у вас налаштовано prisma  

export const authOptions = {  
 providers: [  
 CredentialsProvider({  
 name: 'Credentials',  
 credentials: {  
 email: { label: 'Email', type: 'email' },  
 password: { label: 'Password', type: 'password' },  
 },  
 async authorize(credentials) {  
 if (!credentials?.email || !credentials?.password) {  
 throw new Error('Email і пароль обов\'язкові.')  
 }  

 const user = await prisma.user.findUnique({  
 where: { email: credentials.email },  
 })  

 if (!user) {  
 throw new Error('Невірний email або пароль.')  
 }  

 const isPasswordValid = await bcrypt.compare(credentials.password, user.password)  
 if (!isPasswordValid) {  
 throw new Error('Невірний email або пароль.')  
 }  

 return { id: user.id, email: user.email, firstName: user.firstName, lastName: user.lastName, phone: user.phone }  
 },  
 }),  
 ],  
 session: {  
 strategy: 'jwt', // Використовуємо JWT для управління сесією  
 },  
 pages: {  
 signIn: '/auth/signin', // Налаштуйте свою сторінку входу, якщо потрібно  
 },  
 callbacks: {  
 async jwt({ token, user }) {  
 if (user) {  
 token.id = user.id  
 token.email = user.email  
 token.firstName = user.firstName  
 token.lastName = user.lastName  
 token.phone = user.phone  
 }  
 return token  
 },  
 async session({ session, token }) {  
 if (token) {  
 session.user.id = token.id  
 session.user.email = token.email  
 session.user.firstName = token.firstName  
 session.user.lastName = token.lastName  
 session.user.phone = token.phone  
 }  
 return session  
 },  
 },  
 secret: process.env.JWT_SECRET || 'your_secret_key', // Необов\'язково, вкажіть секретний ключ JWT  
}  

const handler = NextAuth(authOptions)  
export { handler as GET, handler as POST }

Крок 4: Створення фронтенду для аутентифікації

Вам також потрібно створити фронтенд для вашої аутентифікації.
Ось як створити просту сторінку входу за допомогою API NextAuth:

// pages/auth/signin.tsx  
'use client'import { signIn } from 'next-auth/react'  
import { useState } from 'react'export default function SignIn() {  
 const [email, setEmail] = useState('')  
 const [password, setPassword] = useState('')  
 const [error, setError] = useState('')const handleSubmit = async (e: React.FormEvent) => {  
 e.preventDefault()  
 const result = await signIn('credentials', {  
 email,  
 password,  
 redirect: false,  
 })  

 if (result?.error) {  
 setError(result.error)  
 }  
 }return (  

Sign In
 setEmail(e.target.value)}    className="w-full p-2 rounded-[30px] border border-gray-300"    />     setPassword(e.target.value)}    className="w-full p-2 rounded-[30px] border border-gray-300"    />    {error && 
{error}
}        Sign In            
    )   } ```  

## Крок 5: Обробка стану аутентифікації в вашому додатку

Після налаштування аутентифікації, ви можете використовувати хуки **NextAuth** для керування станом аутентифікації в вашому додатку. Ось приклад, як це можна зробити:

// components/Header.tsx 'use client' import { useSession, signOut } from 'next-auth/react' export default function Header() { const { data: session } = useSession() return (
My App
{session ? ( signOut()} className="bg-red-500 p-2 rounded-[30px]"> Sign Out ) : ( Sign In )}
) } ```

Висновок

Тепер ви успішно налаштували NextAuth для аутентифікації у вашому додатку Next.js 15 з використанням TypeScript. Ця конфігурація використовує CredentialsProvider для аутентифікації користувачів за допомогою email і пароля.

Не соромтеся налаштовувати потік аутентифікації на ваш розсуд і впроваджувати більш складні функції, такі як соціальний вхід або збереження сесії.

Якщо ви хочете глибше зануритись у NextAuth або вивчити розширені можливості, документація NextAuth стане чудовим ресурсом.

Перекладено з: How to Implement Authentication with NextAuth in Next.js 15 and TypeScript

Leave a Reply

Your email address will not be published. Required fields are marked *