---
name: authentication-identity-expert
description: "Expert guide for implementing secure authentication, authorization (RBAC/ABAC), OAuth2, and identity management (Clerk, Auth.js, Supabase Auth) / Panduan ahli untuk autentikasi dan otorisasi."
author: "Roedy Rustam"
version: "4.4.2"
---
# Authentication & Identity Expert (2026 Edition)
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
---
## English
### Orchestration & Integration
- **Upstream Orchestrators**: Works under `brainstorming` and `zero-to-prod-orchestrator` (Phase 2 - Foundation, Auth & Identity Architecture) to implement secure user authentication.
- **Downstream Cooperating Skills**:
- `saas-architect` — B2B multi-tenant auth workflows, organization switching, and onboarding.
- `saas-multi-tenant` — RBAC permission matrices, custom session claims, and workspace member access.
- `supabase-security-expert` — Supabase SSR auth, PKCE token cookies, and RLS policies.
- `firebase-security-expert` — Firebase Auth, custom token minting, and security rules.
- `js-backend-expert` — Authorization middleware, JWT token verification, and session stores.
- `production-ready-hardener` — Pre-release auth security audits, rate-limiting, and CSP headers.
- `session-memory-manager` — Store authentication topology decisions and credential schemas.
### Description
Production-grade guide for implementing secure authentication, authorization, and identity management in modern web and mobile applications. Covers **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, JWT patterns, OAuth 2.1, PKCE flows, RBAC/ABAC, passkeys (WebAuthn), and MFA implementations for React 19 / Next.js 15 stacks.
### Trigger Conditions
- Working on login/signup flows, session management, or OAuth integrations.
- Integrating Clerk, Supabase Auth, Auth.js v5, Better Auth, or Auth0.
- Implementing RBAC (Role-Based Access Control) or ABAC.
- Setting up WebAuthn/Passkeys, MFA/2FA, or SSO.
- Securing Next.js App Router routes with middleware-based auth guards.
---
### Identity Provider Selection Guide
| Provider | Best For | Key Strength | Pricing Model |
|---|---|---|---|
| **Clerk** | New SaaS products | Best developer DX, prebuilt UI components, orgs/teams out-of-the-box | Per MAU (free up to 10k) |
| **Supabase Auth** | Existing Supabase apps | Native RLS integration, multi-provider OAuth, generous free tier | Included with Supabase |
| **Auth.js v5** | Self-hosted control | Full data ownership, zero vendor lock-in, Edge-compatible | 100% Free / OSS |
| **Better Auth** | Modern TS-first apps | Comprehensive TypeScript plugin ecosystem, 2FA, passkeys | 100% Free / OSS |
---
### Technical Guidelines & Recipes
#### 1. Password Hashing Standards
```typescript
import argon2 from 'argon2';
export async function hashPassword(password: string): Promise {
return argon2.hash(password, {
type: argon2.argon2id,
memoryCost: 65536, // 64 MB
timeCost: 3,
parallelism: 4,
});
}
```
#### 2. Short-Lived JWT + Refresh Token Rotation
```typescript
// Access token: 15 minutes, in memory
// Refresh token: 7-30 days, HttpOnly, Secure, SameSite=Strict cookie
```
#### 3. OAuth 2.1 + PKCE
```typescript
import { generateCodeVerifier, generateCodeChallenge } from 'oslo/oauth2';
const codeVerifier = generateCodeVerifier();
const codeChallenge = await generateCodeChallenge(codeVerifier);
sessionStorage.setItem('pkce_verifier', codeVerifier);
const authUrl = new URL('https://provider.com/oauth/authorize');
authUrl.searchParams.set('code_challenge', codeChallenge);
authUrl.searchParams.set('code_challenge_method', 'S256');
authUrl.searchParams.set('state', cryptoRandomState);
```
#### 4. Clerk — Next.js 15 Integration
```typescript
// middleware.ts
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
const isPublicRoute = createRouteMatcher(['/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)']);
export default clerkMiddleware(async (auth, req) => {
if (!isPublicRoute(req)) await auth.protect();
});
export const config = {
matcher: ['/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', '/(api|trpc)(.*)'],
};
```
#### 5. Supabase Auth — RLS Integration
> For detailed Supabase Auth SSR setup, PKCE session cookie handling, and PostgreSQL Row-Level Security (RLS) policies, delegate directly to `supabase-security-expert`.
#### 6. Auth.js v5 (Next.js App Router)
```typescript
import NextAuth from 'next-auth';
import GitHub from 'next-auth/providers/github';
import { DrizzleAdapter } from '@auth/drizzle-adapter';
import { db } from '@/db';
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: DrizzleAdapter(db),
providers: [GitHub],
session: { strategy: 'database' },
});
```
#### 7. RBAC — Role-Based Access Control (Server-Side)
```typescript
type Role = 'viewer' | 'editor' | 'admin' | 'super_admin';
const permissions: Record = {
viewer: ['read:posts'],
editor: ['read:posts', 'write:posts', 'delete:own_posts'],
admin: ['read:posts', 'write:posts', 'delete:any_post', 'manage:users'],
super_admin: ['*'],
};
export function hasPermission(userRole: Role, required: string): boolean {
const allowed = permissions[userRole] || [];
return allowed.includes('*') || allowed.includes(required);
}
```
#### 8. WebAuthn / Passkeys (2026 Standard)
```typescript
import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';
export async function getPasskeyRegistrationOptions(userId: string, userEmail: string) {
return generateRegistrationOptions({
rpName: 'My App',
rpID: 'myapp.com',
userID: new TextEncoder().encode(userId),
userName: userEmail,
attestationType: 'none',
authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },
});
}
```
### Production Security Checklist
- [ ] Passwords hashed with argon2id or bcrypt (cost >= 12).
- [ ] JWT access token expires in <= 15 minutes; refresh token in HttpOnly cookie.
- [ ] PKCE enforced for all public OAuth clients.
- [ ] Authorization enforced on server actions and API routes (never UI only).
- [ ] Rate limiting on login and signup endpoints.
### Sovereign Execution, Token Efficiency & Invariants
| Dimension | Sovereign Mandate & Deterministic Contract |
| :--- | :--- |
| **Frontier Model Cascade** | High Fast / High (`Grok 4.7 High Fast`, `Claude Sonnet 5.5 High`, `Gemini 4 Pro`) |
| **Availability Fallback** | `Gemini 4 Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6`; `Grok 4.7` -> `Grok 4.6 High Fast` (Zero unhandled missing-model errors) |
| **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out |
| **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec authentication-identity-expert ` / MCP: `vibes_skill_dispatch`, `vibes_critic_validate`, `vibes_self_heal`, `vibes_eval_sandbox`, `vibes_verify_invariants` |
| **NFR & Anti-Slop Invariants** | Zero OWASP Top 10 vectors, 0 hardcoded secrets, >= 90% branch coverage on domain logic, 0 Anti-Slop violations; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` |
---
## Bahasa Indonesia
### Integrasi Orkestrasi
- **Orkestrator Hulu**: Beroperasi di bawah arahan `brainstorming` dan `zero-to-prod-orchestrator` (Fase 2 - Fondasi, Autentikasi & Arsitektur Identitas) untuk mengimplementasikan autentikasi pengguna yang aman.
- **Skill Hilir & Kerja Sama**:
- `saas-architect` — Alur kerja autentikasi B2B SaaS, perpindahan organisasi, dan onboarding.
- `saas-multi-tenant` — Matriks izin RBAC, custom claims sesi, dan akses anggota workspace.
- `supabase-security-expert` — Konfigurasi otentikasi Supabase SSR, cookie PKCE, dan kebijakan RLS.
- `firebase-security-expert` — Firebase Auth, custom token minting, dan security rules.
- `js-backend-expert` — Middleware otorisasi, verifikasi token JWT, dan session store.
- `production-ready-hardener` — Audit keamanan autentikasi pra-rilis, rate-limiting, dan header CSP.
- `session-memory-manager` — Menyimpan keputusan topologi autentikasi dan skema kredensial.
### Deskripsi
Panduan tingkat produksi untuk implementasi autentikasi aman, otorisasi (RBAC/ABAC), dan manajemen identitas pengguna pada aplikasi web dan mobile modern. Mencakup integrasi **Clerk**, **Supabase Auth**, **Auth.js v5 (NextAuth)**, **Better Auth**, OAuth 2.1 dengan alur PKCE, rotasi Refresh Token HttpOnly, Passkeys (WebAuthn), dan Multi-Factor Authentication (MFA) untuk stack React 19 / Next.js 15.
### Rekomendasi Pemilihan Identity Provider
| Provider | Pilihan Terbaik Untuk | Keunggulan Utama | Model Harga |
|---|---|---|---|
| **Clerk** | Produk SaaS baru & B2B | DX terbaik, UI bawaan siap pakai, manajemen tim/organisasi instan | Per MAU (gratis hingga 10.000 pengguna) |
| **Supabase Auth** | Aplikasi dengan database Supabase | Integrasi native Row-Level Security (RLS), OAuth multi-provider | Termasuk dalam kuota Supabase |
| **Auth.js v5** | Aplikasi mandiri (*Self-hosted*) | Kepemilikan data penuh, zero vendor lock-in, kompatibel Edge | 100% Gratis / Open-Source |
| **Better Auth** | Proyek TypeScript-first modern | Ekosistem plugin komprehensif, 2FA, passkeys bawaan | 100% Gratis / Open-Source |
---
### Resep & Pedoman Teknis Implementasi
#### 1. Standar Hashing Password (Argon2id)
```typescript
import argon2 from 'argon2';
export async function hashPasswordAman(passwordPolos: string): Promise {
return argon2.hash(passwordPolos, {
type: argon2.argon2id,
memoryCost: 65536, // 64 MB
timeCost: 3,
parallelism: 4,
});
}
export async function verifikasiPassword(hashTersimpan: string, passwordInput: string): Promise {
return argon2.verify(hashTersimpan, passwordInput);
}
```
#### 2. Clerk Middleware pada Next.js 15 App Router
```typescript
// middleware.ts
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
// Definisikan rute yang dapat diakses publik tanpa login
const rutePublik = createRouteMatcher([
'/',
'/masuk(.*)',
'/daftar(.*)',
'/api/webhooks(.*)',
]);
export default clerkMiddleware(async (auth, req) => {
if (!rutePublik(req)) {
await auth.protect();
}
});
export const config = {
matcher: [
'/((?!_next|[^?]*\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
'/(api|trpc)(.*)',
],
};
```
#### 3. Auth.js v5 (NextAuth) dengan Adapter Database Drizzle ORM
```typescript
// auth.ts
import NextAuth from 'next-auth';
import GitHub from 'next-auth/providers/github';
import Google from 'next-auth/providers/google';
import { DrizzleAdapter } from '@auth/drizzle-adapter';
import { db } from '@/db';
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: DrizzleAdapter(db),
providers: [
GitHub({ clientId: process.env.AUTH_GITHUB_ID, clientSecret: process.env.AUTH_GITHUB_SECRET }),
Google({ clientId: process.env.AUTH_GOOGLE_ID, clientSecret: process.env.AUTH_GOOGLE_SECRET }),
],
session: { strategy: 'jwt' },
callbacks: {
async jwt({ token, user }) {
if (user) {
token.role = (user as any).role || 'user';
}
return token;
},
async session({ session, token }) {
if (token && session.user) {
(session.user as any).role = token.role;
}
return session;
},
},
});
```
#### 4. Kontrol Akses Berbasis Peran (RBAC) di Sisi Server
```typescript
export type PeranPengguna = 'tamu' | 'anggota' | 'manajer' | 'administrator';
const matriksIzin: Record = {
tamu: ['baca:artikel'],
anggota: ['baca:artikel', 'buat:komentar'],
manajer: ['baca:artikel', 'buat:komentar', 'kelola:konten'],
administrator: ['*'],
};
export function validasiIzin(peran: PeranPengguna, izinYangDibutuhkan: string): boolean {
const daftarIzin = matriksIzin[peran] || [];
return daftarIzin.includes('*') || daftarIzin.includes(izinYangDibutuhkan);
}
```
### Checklist Keamanan Otentikasi Produksi
- [ ] Password di-hash menggunakan `argon2id` atau `bcrypt` dengan work factor minimal 12.
- [ ] Access token berumur pendek (maksimal 15 menit) disimpan di memori runtime.
- [ ] Refresh token disimpan di cookie berflag `HttpOnly`, `Secure`, dan `SameSite=Strict` dengan rotasi token.
- [ ] Alur OAuth 2.1 publik wajib menerapkan `PKCE` (Proof Key for Code Exchange) dengan challenge SHA-256.
- [ ] Otorisasi hak akses divalidasi ketat pada Server Action dan API Route (bukan sekadar menyembunyikan tombol UI).
- [ ] Proteksi brute-force dengan pembatasan laju (*Rate Limiting*) pada endpoint login dan pendaftaran.
### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian
| Dimensi | Mandat Berdaulat & Kontrak Deterministik |
| :--- | :--- |
| **Kaskade Model Frontier** | High Fast / High (`Grok 4.7 High Fast`, `Claude Sonnet 5.5 High`, `Gemini 4 Pro`) |
| **Invarian Fallback Ketersediaan** | `Gemini 4 Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6`; `Grok 4.7` -> `Grok 4.6 High Fast` (Bebas gagal saat model belum tersedia/kuota penuh) |
| **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out |
| **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec authentication-identity-expert ` / MCP: `vibes_skill_dispatch`, `vibes_critic_validate`, `vibes_self_heal`, `vibes_eval_sandbox`, `vibes_verify_invariants` |
| **Invarian NFR & Anti-Slop** | Nol celah OWASP Top 10, 0 kredensial hardcoded, cakupan pengujian >= 90% pada logika domain, 0 pelanggaran Anti-Slop; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |