AUTHENTICATION DOCS
SETUP
Name
Description
Example
Output
Auth.js Route Handler (App Router)Description: Route handler untuk Auth.js di App Router (Next.js).
Example:
// app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth"
export const { GET, POST } = handlersOutput: Auth API siap
Auth.js Route Handler (App Router)Route handler untuk Auth.js di App Router (Next.js).
// app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth"
export const { GET, POST } = handlersAuth API siap
Auth.js Config FileDescription: File konfigurasi Auth.js (auth.ts) yang berisi providers, adapter, callbacks.
Example:
// auth.ts
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [GitHub]
})Output: Auth instance
Auth.js Config FileFile konfigurasi Auth.js (auth.ts) yang berisi providers, adapter, callbacks.
// auth.ts
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [GitHub]
})Auth instance
Auth.js MiddlewareDescription: Middleware untuk proteksi rute menggunakan Auth.js.
Example:
// middleware.ts
import { auth } from "@/auth"
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname !== "/login") {
return Response.redirect(new URL("/login", req.url))
}
})Output: Rute terproteksi
Auth.js MiddlewareMiddleware untuk proteksi rute menggunakan Auth.js.
// middleware.ts
import { auth } from "@/auth"
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname !== "/login") {
return Response.redirect(new URL("/login", req.url))
}
})Rute terproteksi
InstallationDescription: Instalasi Auth.js dengan Next.js.
Example:
pnpm add next-auth @auth/prisma-adapter
Output: Package terinstal
InstallationInstalasi Auth.js dengan Next.js.
pnpm add next-auth @auth/prisma-adapter
Package terinstal
PROVIDERS
Name
Description
Example
Output
GoogleProviderDescription: Login dengan Google OAuth.
Example:
import Google from "next-auth/providers/google"
Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET
})Output: Tombol Login Google
GoogleProviderLogin dengan Google OAuth.
import Google from "next-auth/providers/google"
Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET
})Tombol Login Google
GitHubProviderDescription: Login dengan GitHub OAuth.
Example:
import GitHub from "next-auth/providers/github"
GitHub({
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET
})Output: Tombol Login GitHub
GitHubProviderLogin dengan GitHub OAuth.
import GitHub from "next-auth/providers/github"
GitHub({
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET
})Tombol Login GitHub
CredentialsProviderDescription: Login custom dengan email/password atau kredensial lainnya.
Example:
import Credentials from "next-auth/providers/credentials"
Credentials({
name: "credentials",
credentials: {
email: { label: "Email", type: "email" },
password: { label: "Password", type: "password" }
},
async authorize(credentials) {
const user = await verifyUser(credentials)
return user ?? null
}
})Output: Login custom
CredentialsProviderLogin custom dengan email/password atau kredensial lainnya.
import Credentials from "next-auth/providers/credentials"
Credentials({
name: "credentials",
credentials: {
email: { label: "Email", type: "email" },
password: { label: "Password", type: "password" }
},
async authorize(credentials) {
const user = await verifyUser(credentials)
return user ?? null
}
})Login custom
DiscordProviderDescription: Login dengan Discord.
Example:
import Discord from "next-auth/providers/discord"
Discord({
clientId: process.env.DISCORD_CLIENT_ID,
clientSecret: process.env.DISCORD_CLIENT_SECRET
})Output: Tombol Login Discord
DiscordProviderLogin dengan Discord.
import Discord from "next-auth/providers/discord"
Discord({
clientId: process.env.DISCORD_CLIENT_ID,
clientSecret: process.env.DISCORD_CLIENT_SECRET
})Tombol Login Discord
EmailProviderDescription: Login tanpa password via email (Magic Link).
Example:
import Email from "next-auth/providers/email"
Email({
server: process.env.EMAIL_SERVER,
from: process.env.EMAIL_FROM
})Output: Kirim email magic link
EmailProviderLogin tanpa password via email (Magic Link).
import Email from "next-auth/providers/email"
Email({
server: process.env.EMAIL_SERVER,
from: process.env.EMAIL_FROM
})Kirim email magic link
AppleProviderDescription: Login dengan Apple.
Example:
import Apple from "next-auth/providers/apple"
Apple({
clientId: process.env.APPLE_ID,
clientSecret: process.env.APPLE_SECRET
})Output: Tombol Login Apple
AppleProviderLogin dengan Apple.
import Apple from "next-auth/providers/apple"
Apple({
clientId: process.env.APPLE_ID,
clientSecret: process.env.APPLE_SECRET
})Tombol Login Apple
HOOKS-CLIENT
Name
Description
Example
Output
useSessionDescription: Hook client untuk mendapatkan data sesi pengguna.
Example:
import { useSession } from "next-auth/react"
export default function Component() {
const { data: session, status } = useSession()
return <p>{session?.user?.name}</p>
}Output: { user: { name: 'Ridho', email: '...' } }
useSessionHook client untuk mendapatkan data sesi pengguna.
import { useSession } from "next-auth/react"
export default function Component() {
const { data: session, status } = useSession()
return <p>{session?.user?.name}</p>
}{ user: { name: 'Ridho', email: '...' } }
signInDescription: Fungsi client untuk memulai proses login.
Example:
import { signIn } from "next-auth/react"
<button onClick={() => signIn("google")}>Login with Google</button>Output: Redirect ke Google
signInFungsi client untuk memulai proses login.
import { signIn } from "next-auth/react"
<button onClick={() => signIn("google")}>Login with Google</button>Redirect ke Google
signOutDescription: Fungsi client untuk logout.
Example:
import { signOut } from "next-auth/react"
<button onClick={() => signOut()}>Logout</button>Output: Sesi dihancurkan
signOutFungsi client untuk logout.
import { signOut } from "next-auth/react"
<button onClick={() => signOut()}>Logout</button>Sesi dihancurkan
SessionProviderDescription: Provider client untuk membungkus aplikasi dan menyediakan sesi.
Example:
// app/layout.tsx
import { SessionProvider } from "next-auth/react"
export default function RootLayout({ children, session }) {
return <SessionProvider session={session}>{children}</SessionProvider>
}Output: Sesi tersedia di klien
SessionProviderProvider client untuk membungkus aplikasi dan menyediakan sesi.
// app/layout.tsx
import { SessionProvider } from "next-auth/react"
export default function RootLayout({ children, session }) {
return <SessionProvider session={session}>{children}</SessionProvider>
}Sesi tersedia di klien
SERVER-SIDE
Name
Description
Example
Output
auth()Description: Mendapatkan sesi di Server Component (Auth.js v5).
Example:
import { auth } from "@/auth"
export default async function ServerPage() {
const session = await auth()
return <p>{session?.user?.name}</p>
}Output: { user: { name: 'Ridho' } }
auth()Mendapatkan sesi di Server Component (Auth.js v5).
import { auth } from "@/auth"
export default async function ServerPage() {
const session = await auth()
return <p>{session?.user?.name}</p>
}{ user: { name: 'Ridho' } }
getServerSession (legacy)Description: Mendapatkan sesi di server (NextAuth v4).
Example:
import { getServerSession } from "next-auth"
import { authOptions } from "@/auth"
export async function getServerSideProps(ctx) {
const session = await getServerSession(ctx, authOptions)
return { props: { session } }
}Output: { user: { ... } }
getServerSession (legacy)Mendapatkan sesi di server (NextAuth v4).
import { getServerSession } from "next-auth"
import { authOptions } from "@/auth"
export async function getServerSideProps(ctx) {
const session = await getServerSession(ctx, authOptions)
return { props: { session } }
}{ user: { ... } }
API Route Protection (App Router)Description: Proteksi route handler dengan auth().
Example:
import { auth } from "@/auth"
export async function GET() {
const session = await auth()
if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 })
return Response.json({ data: 'ok' })
}Output: Respons 401 jika tidak login
API Route Protection (App Router)Proteksi route handler dengan auth().
import { auth } from "@/auth"
export async function GET() {
const session = await auth()
if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 })
return Response.json({ data: 'ok' })
}Respons 401 jika tidak login
SESSION-MANAGEMENT
Name
Description
Example
Output
callbacks.jwtDescription: Menyesuaikan token JWT saat login/refresh.
Example:
callbacks: {
async jwt({ token, user }) {
if (user) {
token.role = user.role
}
return token
}
}Output: Token JWT berisi role
callbacks.jwtMenyesuaikan token JWT saat login/refresh.
callbacks: {
async jwt({ token, user }) {
if (user) {
token.role = user.role
}
return token
}
}Token JWT berisi role
callbacks.sessionDescription: Menyesuaikan objek sesi yang dikirim ke klien.
Example:
callbacks: {
async session({ session, token }) {
session.user.role = token.role
return session
}
}Output: Session.user.role tersedia
callbacks.sessionMenyesuaikan objek sesi yang dikirim ke klien.
callbacks: {
async session({ session, token }) {
session.user.role = token.role
return session
}
}Session.user.role tersedia
session.strategyDescription: Strategi penyimpanan sesi: "jwt" (default) atau "database".
Example:
session: {
strategy: "jwt"
}Output: Sesi disimpan di JWT
session.strategyStrategi penyimpanan sesi: "jwt" (default) atau "database".
session: {
strategy: "jwt"
}Sesi disimpan di JWT
callbacks.signInDescription: Mengontrol apakah user boleh login.
Example:
callbacks: {
async signIn({ user, account }) {
if (account.provider === "google") {
return user.email?.endsWith("@company.com")
}
return true
}
}Output: Hanya email company yang diizinkan
callbacks.signInMengontrol apakah user boleh login.
callbacks: {
async signIn({ user, account }) {
if (account.provider === "google") {
return user.email?.endsWith("@company.com")
}
return true
}
}Hanya email company yang diizinkan
callbacks.redirectDescription: Mengarahkan ulang setelah login/logout.
Example:
callbacks: {
async redirect({ url, baseUrl }) {
return url.startsWith(baseUrl) ? url : baseUrl
}
}Output: Redirect aman
callbacks.redirectMengarahkan ulang setelah login/logout.
callbacks: {
async redirect({ url, baseUrl }) {
return url.startsWith(baseUrl) ? url : baseUrl
}
}Redirect aman
DATABASE-ADAPTER
Name
Description
Example
Output
PrismaAdapterDescription: Menyimpan sesi, akun, dan user di database menggunakan Prisma.
Example:
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/lib/prisma"
export const { handlers, auth } = NextAuth({
adapter: PrismaAdapter(prisma)
})Output: Database session
PrismaAdapterMenyimpan sesi, akun, dan user di database menggunakan Prisma.
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/lib/prisma"
export const { handlers, auth } = NextAuth({
adapter: PrismaAdapter(prisma)
})Database session
Schema Prisma untuk Auth.jsDescription: Model yang diperlukan di schema.prisma.
Example:
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String?
access_token String?
expires_at Int?
token_type String?
scope String?
id_token String?
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
image String?
accounts Account[]
sessions Session[]
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}Output: Model siap
Schema Prisma untuk Auth.jsModel yang diperlukan di schema.prisma.
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String?
access_token String?
expires_at Int?
token_type String?
scope String?
id_token String?
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
image String?
accounts Account[]
sessions Session[]
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}Model siap
Database MigrationDescription: Membuat tabel yang diperlukan Auth.js.
Example:
pnpm exec prisma migrate dev --name auth-js
Output: Tabel Account, Session, User, VerificationToken
Database MigrationMembuat tabel yang diperlukan Auth.js.
pnpm exec prisma migrate dev --name auth-js
Tabel Account, Session, User, VerificationToken
SECURITY
Name
Description
Example
Output
Middleware Route ProtectionDescription: Mengamankan rute dengan middleware Auth.js.
Example:
// middleware.ts
import { auth } from "@/auth"
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname !== "/login") {
return Response.redirect(new URL("/login", req.url))
}
})
export const config = { matcher: ["/dashboard/:path*"] }Output: Halaman /dashboard hanya untuk login
Middleware Route ProtectionMengamankan rute dengan middleware Auth.js.
// middleware.ts
import { auth } from "@/auth"
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname !== "/login") {
return Response.redirect(new URL("/login", req.url))
}
})
export const config = { matcher: ["/dashboard/:path*"] }Halaman /dashboard hanya untuk login
CSRF ProtectionDescription: Auth.js menangani CSRF secara otomatis pada API routes.
Example:
Tidak perlu konfigurasi khusus.
Output: CSRF otomatis
CSRF ProtectionAuth.js menangani CSRF secara otomatis pada API routes.
Tidak perlu konfigurasi khusus.
CSRF otomatis
JWT EncryptionDescription: Token JWT dienkripsi dengan AUTH_SECRET.
Example:
AUTH_SECRET=your-secret-key
Output: JWT terenkripsi
JWT EncryptionToken JWT dienkripsi dengan AUTH_SECRET.
AUTH_SECRET=your-secret-key
JWT terenkripsi
Custom JWT Encode/DecodeDescription: Override encoding/dekoding JWT.
Example:
jwt: {
encode({ token, secret }) { ... },
decode({ token, secret }) { ... }
}Output: Kustom JWT
Custom JWT Encode/DecodeOverride encoding/dekoding JWT.
jwt: {
encode({ token, secret }) { ... },
decode({ token, secret }) { ... }
}Kustom JWT
CUSTOM-PAGES
Name
Description
Example
Output
pages.signInDescription: Halaman login kustom.
Example:
pages: {
signIn: '/auth/login'
}Output: Redirect ke /auth/login
pages.signInHalaman login kustom.
pages: {
signIn: '/auth/login'
}Redirect ke /auth/login
pages.errorDescription: Halaman error kustom.
Example:
pages: {
error: '/auth/error'
}Output: Redirect ke /auth/error
pages.errorHalaman error kustom.
pages: {
error: '/auth/error'
}Redirect ke /auth/error
pages.verifyRequestDescription: Halaman verifikasi setelah email magic link dikirim.
Example:
pages: {
verifyRequest: '/auth/check-email'
}Output: Redirect ke /auth/check-email
pages.verifyRequestHalaman verifikasi setelah email magic link dikirim.
pages: {
verifyRequest: '/auth/check-email'
}Redirect ke /auth/check-email
pages.newUserDescription: Halaman setelah user baru terdaftar.
Example:
pages: {
newUser: '/auth/welcome'
}Output: Redirect ke /auth/welcome
pages.newUserHalaman setelah user baru terdaftar.
pages: {
newUser: '/auth/welcome'
}Redirect ke /auth/welcome
EVENTS
Name
Description
Example
Output
events.signInDescription: Callback saat user berhasil login.
Example:
events: {
async signIn({ user, account, isNewUser }) {
console.log(`${user.name} signed in`)
}
}Output: Log login
events.signInCallback saat user berhasil login.
events: {
async signIn({ user, account, isNewUser }) {
console.log(`${user.name} signed in`)
}
}Log login
events.signOutDescription: Callback saat user logout.
Example:
events: {
async signOut({ session }) { ... }
}Output: Log logout
events.signOutCallback saat user logout.
events: {
async signOut({ session }) { ... }
}Log logout
events.createUserDescription: Callback setelah user baru dibuat di database.
Example:
events: {
async createUser({ user }) {
await sendWelcomeEmail(user.email)
}
}Output: Kirim email selamat datang
events.createUserCallback setelah user baru dibuat di database.
events: {
async createUser({ user }) {
await sendWelcomeEmail(user.email)
}
}Kirim email selamat datang
events.linkAccountDescription: Callback saat akun OAuth ditautkan ke user yang sudah ada.
Example:
events: {
async linkAccount({ user, account, profile }) { ... }
}Output: Log penautan
events.linkAccountCallback saat akun OAuth ditautkan ke user yang sudah ada.
events: {
async linkAccount({ user, account, profile }) { ... }
}Log penautan
events.sessionDescription: Callback saat sesi diakses (setiap request).
Example:
events: {
async session({ session, token }) { ... }
}Output: Log aktivitas sesi
events.sessionCallback saat sesi diakses (setiap request).
events: {
async session({ session, token }) { ... }
}Log aktivitas sesi
ADVANCED
Name
Description
Example
Output
Email VerificationDescription: Verifikasi email setelah pendaftaran atau login.
Example:
// Menggunakan Email provider atau credentials dengan verifikasi
callbacks: {
async signIn({ user }) {
if (!user.emailVerified) {
throw new Error("Email not verified")
}
return true
}
}Output: Hanya email terverifikasi yang bisa login
Email VerificationVerifikasi email setelah pendaftaran atau login.
// Menggunakan Email provider atau credentials dengan verifikasi
callbacks: {
async signIn({ user }) {
if (!user.emailVerified) {
throw new Error("Email not verified")
}
return true
}
}Hanya email terverifikasi yang bisa login
Magic LinkDescription: Login tanpa password dengan email magic link.
Example:
// Gunakan EmailProvider dan kirim link ke email
import Email from "next-auth/providers/email"
Email({
server: process.env.EMAIL_SERVER,
from: process.env.EMAIL_FROM,
maxAge: 10 * 60 // 10 menit
})Output: Link login dikirim ke email
Magic LinkLogin tanpa password dengan email magic link.
// Gunakan EmailProvider dan kirim link ke email
import Email from "next-auth/providers/email"
Email({
server: process.env.EMAIL_SERVER,
from: process.env.EMAIL_FROM,
maxAge: 10 * 60 // 10 menit
})Link login dikirim ke email
Credentials Flow with JWTDescription: Login custom dengan mengembalikan user dan membuat JWT.
Example:
Credentials({
async authorize(credentials) {
const user = await verifyUser(credentials)
if (user) {
return { id: user.id, name: user.name, email: user.email, role: user.role }
}
return null
}
})Output: User object masuk ke JWT
Credentials Flow with JWTLogin custom dengan mengembalikan user dan membuat JWT.
Credentials({
async authorize(credentials) {
const user = await verifyUser(credentials)
if (user) {
return { id: user.id, name: user.name, email: user.email, role: user.role }
}
return null
}
})User object masuk ke JWT
Refresh Token RotationDescription: Memperbarui access token OAuth yang kedaluwarsa.
Example:
callbacks: {
async jwt({ token, account }) {
if (account) {
token.accessToken = account.access_token
token.refreshToken = account.refresh_token
}
// Refresh token jika expired
if (Date.now() < token.expires_at * 1000) {
return token
}
return refreshAccessToken(token)
}
}Output: Token selalu segar
Refresh Token RotationMemperbarui access token OAuth yang kedaluwarsa.
callbacks: {
async jwt({ token, account }) {
if (account) {
token.accessToken = account.access_token
token.refreshToken = account.refresh_token
}
// Refresh token jika expired
if (Date.now() < token.expires_at * 1000) {
return token
}
return refreshAccessToken(token)
}
}Token selalu segar
Role-Based Access Control (RBAC)Description: Membatasi akses berdasarkan role user.
Example:
// Di middleware
import { auth } from "@/auth"
export default auth((req) => {
if (req.auth?.user?.role !== "admin") {
return Response.redirect(new URL("/403", req.url))
}
})Output: Hanya admin yang bisa mengakses
Role-Based Access Control (RBAC)Membatasi akses berdasarkan role user.
// Di middleware
import { auth } from "@/auth"
export default auth((req) => {
if (req.auth?.user?.role !== "admin") {
return Response.redirect(new URL("/403", req.url))
}
})Hanya admin yang bisa mengakses