ทำ Authentication ด้วย NextAuth.js
ตัวอย่างการใช้ NextAuth.js
NextAuth.js เป็น Library ที่ช่วยให้การทำ Authentication ง่ายขึ้น ซึ่ง NextAuth.js รองรับทั้งการยืนยันตัวตนด้วย OAuth, Credentials และการยืนยันตัวตนผ่านบัญชีผู้ใช้ภายนอก เช่น Google, GitHub, Facebook และอื่นๆ
การติดตั้ง NextAuth.js
เราจะติดตั้ง NextAuth.js และตัวเชื่อมต่อฐานข้อมูลที่จำเป็น (เช่น Prisma, MongoDB) โดยใช้คำสั่ง:
npm install next-auth
หรือถ้าใช้ Yarn:
yarn add next-auth
การตั้งค่า NextAuth.js
ทำการสร้างไฟล์ API สำหรับการจัดการการยืนยันตัวตนที่ pages/api/auth/[...nextauth].ts
หรือ pages/api/auth/[...nextauth].js
:
import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';
export default NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
],
callbacks: {
async session({ session, user }) {
session.user.id = user.id;
return session;
},
},
});
จากนั้นเราสร้างไฟล์ .env.local
เพื่อเก็บค่า Client ID และ Client Secret:
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
NEXTAUTH_URL=http://localhost:3000
การใช้งานใน Component
ใช้ NextAuth ใน Component เพื่อให้ผู้ใช้สามารถล็อกอินและล็อกเอาต์ได้:
import { signIn, signOut, useSession } from 'next-auth/react';
export default function AuthButton() {
const { data: session } = useSession();
return session ? (
<>
<p>Welcome, {session.user?.name}!</p>
<button onClick={() => signOut()}>Sign Out</button>
</>
) : (
<button onClick={() => signIn('google')}>Sign In with Google</button>
);
}
Protecting Routes
เพื่อให้แน่ใจว่าผู้ใช้งาน จะต้องล็อกอินก่อนเข้าถึงหน้าใด ๆ สามารถใช้ getServerSideProps
:
import { getSession } from 'next-auth/react';
export async function getServerSideProps(context) {
const session = await getSession(context);
if (!session) {
return {
redirect: {
destination: '/api/auth/signin',
permanent: false,
},
};
}
return { props: { session } };
}
การกำหนดสิทธิ์ (Authorization)
สามารถเพิ่มฟังก์ชันเพื่อกำหนดสิทธิ์ของผู้ใช้งานได้ เช่น ตรวจสอบว่าเป็น Admin หรือไม่:
callbacks: {
async jwt({ token, user }) {
if (user) {
token.role = user.role;
}
return token;
},
async session({ session, token }) {
session.user.role = token.role;
return session;
},
}
สรุป
NextAuth.js เป็นเครื่องมือที่ทำให้การจัดการ Authentication ใน Next.js เป็นเรื่องง่าย รองรับ OAuth และการยืนยันตัวตนผ่านฐานข้อมูล สามารถปรับแต่งการกำหนดสิทธิ์และเชื่อมต่อกับ Prisma หรือฐานข้อมูลอื่น ๆ ได้อย่างยืดหยุ่น