NextAuth
Installation and Usage

NextAuth

NextAuth adalah library yang digunakan untuk mengatur autentikasi pada aplikasi Next.js. Library ini menyediakan berbagai macam provider autentikasi seperti Google, Facebook, Twitter, GitHub, dan lain-lain. Selain itu, NextAuth juga menyediakan autentikasi dengan email dan password.

Instalasi

pnpm install next-auth

Konfigurasi

// app/api/auth/[...nextauth].js
 
import NextAuth from 'next-auth/next';
 
import { options } from '@/utils/nextauth/option';
 
const handler = NextAuth({
    providers: [
        Credentials({
            name: 'Credentials',
            credentials: {
                email: { label: 'Email', type: 'email', placeholder: 'Email' },
                password: { label: 'Password', type: 'password' },
            },
            authorize: async (credentials) => {
                return null;
            },
        }),
        GithubProvider({
            clientId: process.env.GITHUB_ID as string,
            clientSecret: process.env.GITHUB_SECRET as string,
        }),
        ];
    });
 
export { handler as GET, handler as POST };

Penggunaan

// login/page.tsx
 
"use client";
 
import { signIn, signOut, useSession } from "next-auth/react";
import { useState } from "react";
 
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
 
export default function Page() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const { status } = useSession();
 
  return (
    <div>
      {status === "authenticated" ? (
        <Button onClick={() => signOut()}>Logout</Button>
      ) : (
        <div>
          <Input value={email} onChange={(e) => setEmail(e.target.value)} />
          <Input
            value={password}
            onChange={(e) => setPassword(e.target.value)}
          />
          <Button
            onClick={() =>
              signIn("credentials", {
                email,
                password,
                redirect: false,
              })
            }
          >
            Login
          </Button>
        </div>
      )}
    </div>
  );
}

Autentikasi dengan Email dan Password

Untuk menggunakan autentikasi dengan email dan password, kita perlu membuat sebuah fungsi authorize pada provider Credentials. Fungsi ini akan menerima sebuah objek credentials yang berisi email dan password yang dikirimkan oleh user. Fungsi ini harus mengembalikan sebuah objek user jika autentikasi berhasil atau null jika gagal.

// app/api/auth/[...nextauth].js
 
import NextAuth from 'next-auth/next';
 
import { options } from '@/utils/nextauth/option';
 
const handler = NextAuth({
    providers: [
        Credentials({
            name: 'Credentials',
            credentials: {
                email: { label: 'Email', type: 'email', placeholder: 'Email' },
                password: { label: 'Password', type: 'password' },
            },
            authorize: async (credentials) => {
                const user = await prisma.user.findUnique({
                    where: {
                        email: credentials.email,
                    },
                });
 
                if (!user) {
                    return null;
                }
 
                const isValid = await argon2.verify(user.password, credentials.password);
 
                if (!isValid) {
                    return null;
                }
 
                return user;
            },
        }),
        ];
    });
 
export { handler as GET, handler as POST };
 

Autentikasi dengan GitHub

Untuk menggunakan autentikasi dengan GitHub, kita perlu membuat sebuah aplikasi OAuth di GitHub. Setelah itu, kita perlu mengisi clientId dan clientSecret pada provider GithubProvider.

// app/api/auth/[...nextauth].js
 
import NextAuth from 'next-auth/next';
 
import { options } from '@/utils/nextauth/option';
 
const handler = NextAuth({
    providers: [
        GithubProvider({
            clientId: process.env.GITHUB_ID as string,
            clientSecret: process.env.GITHUB_SECRET as string,
        }),
        ];
    });
 
export { handler as GET, handler as POST };