vibes-plug 1.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.github/workflows/publish.yml +20 -0
  2. package/AGENTS.md +66 -0
  3. package/BLUEPRINT.md +152 -60
  4. package/CHANGELOG.md +50 -0
  5. package/README.md +346 -194
  6. package/package.json +25 -25
  7. package/plugin.json +1 -1
  8. package/skills/ai-cost-token-optimizer/SKILL.md +52 -0
  9. package/skills/ai-llm-integration-expert/SKILL.md +180 -162
  10. package/skills/api-design-expert/SKILL.md +314 -310
  11. package/skills/app-analyzer-optimizer/SKILL.md +193 -189
  12. package/skills/apple-ecosystem-expert/SKILL.md +142 -0
  13. package/skills/async-queue-temporal-expert/SKILL.md +54 -0
  14. package/skills/authentication-identity-expert/SKILL.md +251 -20
  15. package/skills/auto-doc-updater/SKILL.md +214 -204
  16. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  17. package/skills/autonomous-red-teamer/SKILL.md +59 -0
  18. package/skills/autonomous-swarm-director/SKILL.md +69 -0
  19. package/skills/autonomous-tdd-debugger/SKILL.md +65 -0
  20. package/skills/bootstrap-to-modern/SKILL.md +90 -86
  21. package/skills/brainstorming/SKILL.md +373 -353
  22. package/skills/browser-automation-expert/SKILL.md +46 -0
  23. package/skills/ci-cd-devops-architect/SKILL.md +72 -45
  24. package/skills/cloud-hosting-expert/SKILL.md +244 -244
  25. package/skills/coderabbit/SKILL.md +192 -192
  26. package/skills/cron-scheduler-expert/SKILL.md +298 -0
  27. package/skills/data-telemetry-expert/SKILL.md +213 -213
  28. package/skills/database-orm-expert/SKILL.md +294 -294
  29. package/skills/dependency-upgrade-migrator/SKILL.md +295 -0
  30. package/skills/design-system-architect/SKILL.md +27 -10
  31. package/skills/doku-mcp-server/SKILL.md +251 -0
  32. package/skills/doku-payment-gateway/SKILL.md +227 -0
  33. package/skills/e2e-testing-expert/SKILL.md +315 -315
  34. package/skills/edge-serverless-db-expert/SKILL.md +43 -0
  35. package/skills/email-notification-expert/SKILL.md +362 -0
  36. package/skills/error-resilience-expert/SKILL.md +480 -0
  37. package/skills/event-driven-architect/SKILL.md +81 -81
  38. package/skills/feature-flag-analytics-expert/SKILL.md +46 -0
  39. package/skills/file-upload-media-expert/SKILL.md +431 -0
  40. package/skills/form-validation-expert/SKILL.md +401 -0
  41. package/skills/fullstack-expert/SKILL.md +202 -202
  42. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  43. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  44. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  45. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  46. package/skills/gemini-agent-booster/SKILL.md +135 -135
  47. package/skills/global-a11y-i18n-expert/SKILL.md +81 -81
  48. package/skills/glsl-shader-expert/SKILL.md +101 -0
  49. package/skills/go-programming-expert/SKILL.md +295 -295
  50. package/skills/graphql-apollo-expert/SKILL.md +108 -0
  51. package/skills/hig/SKILL.md +188 -188
  52. package/skills/hyper-context-synthesizer/SKILL.md +55 -0
  53. package/skills/js-backend-expert/SKILL.md +34 -9
  54. package/skills/legacy-code-translator/SKILL.md +65 -0
  55. package/skills/llm-cost-arbitrage-router/SKILL.md +59 -0
  56. package/skills/logging-error-tracking-expert/SKILL.md +338 -0
  57. package/skills/mcp-client-orchestrator/SKILL.md +70 -0
  58. package/skills/mcp-server-architect/SKILL.md +194 -194
  59. package/skills/micro-frontend-architect/SKILL.md +106 -0
  60. package/skills/mobile-expo-expert/SKILL.md +186 -186
  61. package/skills/mobile-push-notification-expert/SKILL.md +51 -0
  62. package/skills/monday-design-aesthetic/SKILL.md +67 -67
  63. package/skills/monorepo-architect/SKILL.md +227 -227
  64. package/skills/mpa-orchestrator/SKILL.md +101 -101
  65. package/skills/multi-agent-orchestration/SKILL.md +234 -234
  66. package/skills/multiple-entry-points/SKILL.md +55 -55
  67. package/skills/mvc-expert/SKILL.md +231 -231
  68. package/skills/payment-gateway-expert/SKILL.md +45 -45
  69. package/skills/performance-web-vitals/SKILL.md +332 -332
  70. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  71. package/skills/prd-architect/SKILL.md +201 -191
  72. package/skills/proactive-background-watcher/SKILL.md +62 -0
  73. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  74. package/skills/production-ready-hardener/SKILL.md +173 -186
  75. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  76. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  77. package/skills/project-context-mapper/SKILL.md +79 -0
  78. package/skills/python-programming-expert/SKILL.md +263 -132
  79. package/skills/rate-limit-abuse-prevention/SKILL.md +371 -0
  80. package/skills/realtime-collaboration-expert/SKILL.md +45 -45
  81. package/skills/rust-programming-expert/SKILL.md +235 -235
  82. package/skills/saas-billing/SKILL.md +377 -377
  83. package/skills/saas-multi-tenant/SKILL.md +251 -237
  84. package/skills/saas-mvp-launcher/SKILL.md +10 -0
  85. package/skills/saas-transformer/SKILL.md +187 -144
  86. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  87. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  88. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  89. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  90. package/skills/scalability-clean-code/SKILL.md +229 -229
  91. package/skills/self-evolving-memory-graph/SKILL.md +75 -0
  92. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  93. package/skills/senior-frontend/SKILL.md +161 -161
  94. package/skills/senior-fullstack/SKILL.md +167 -167
  95. package/skills/seo/SKILL.md +235 -225
  96. package/skills/seo-geo/SKILL.md +188 -188
  97. package/skills/session-context-loader/SKILL.md +77 -0
  98. package/skills/session-handoff-resume/SKILL.md +158 -158
  99. package/skills/skill_baru/SKILL.md +172 -147
  100. package/skills/spa-orchestrator/SKILL.md +288 -288
  101. package/skills/state-management-expert/SKILL.md +272 -272
  102. package/skills/supabase-security-expert/SKILL.md +243 -243
  103. package/skills/tailwind-expert/SKILL.md +188 -188
  104. package/skills/tanstack-query-expert/SKILL.md +199 -199
  105. package/skills/token-saver/SKILL.md +119 -111
  106. package/skills/typescript-expert/SKILL.md +324 -279
  107. package/skills/ui-components-expert/SKILL.md +263 -46
  108. package/skills/ui-ux-pro-max/SKILL.md +202 -201
  109. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  110. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  111. package/skills/ui_ux_expert/SKILL.md +17 -6
  112. package/skills/vector-db-rag-expert/SKILL.md +52 -0
  113. package/skills/vibe-code-gardener/SKILL.md +181 -173
  114. package/skills/visual-qa-vision-agent/SKILL.md +65 -0
  115. package/skills/vue-frontend-expert/SKILL.md +126 -0
  116. package/skills/web-3d-graphics-expert/SKILL.md +131 -0
  117. package/skills/web-game-engine-expert/SKILL.md +96 -0
  118. package/skills/web-scraper/SKILL.md +207 -205
  119. package/skills/website-design-cloner/SKILL.md +174 -0
  120. package/skills/webxr-ar-vr-expert/SKILL.md +117 -0
  121. package/skills/zero-to-prod-orchestrator/SKILL.md +206 -180
  122. package/skills/zero-trust-secret-vault/SKILL.md +40 -0
  123. package/vibes-swarm-demo.gif +0 -0
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: authentication-identity-expert
3
3
  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."
4
- author: "Antigravity"
4
+ author: vibes-plug-swarm
5
5
  ---
6
6
 
7
- # Authentication & Identity Expert / Ahli Autentikasi & Identitas
7
+ # Authentication & Identity Expert (2026 Edition)
8
8
 
9
9
  [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
10
 
@@ -14,17 +14,217 @@ author: "Antigravity"
14
14
  ## English
15
15
 
16
16
  ### Description
17
- Expert guide for implementing robust and secure authentication and authorization systems in web and mobile applications. Covers JWT, Session management, OAuth2 providers, Identity as a Service (Clerk, Supabase Auth, Auth0), and Role/Attribute-Based Access Control (RBAC/ABAC).
18
-
19
- ### Instructions
20
- - **Never Roll Your Own Crypto**: Always use established libraries (like `bcrypt` or `argon2`) for hashing passwords if not using an Identity Provider.
21
- - **Session & Token Management**: Keep JWT lifetimes short (e.g., 15 minutes) and use secure, HttpOnly, SameSite cookies for refresh tokens to prevent XSS attacks.
22
- - **OAuth2 & SSO Integration**: When implementing OAuth, strictly validate the `state` parameter to mitigate CSRF attacks during the callback phase.
23
- - **Authorization (RBAC/ABAC)**: Enforce authorization checks at the server level (API routes, database queries), not just on the UI layer. Never expose sensitive data based on client-side roles alone.
24
- - **MFA (Multi-Factor Authentication)**: Recommend and implement MFA/2FA for administrative or high-privilege accounts.
17
+ 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 implementation for React 19 / Next.js 15 stacks.
25
18
 
26
19
  ### Trigger Conditions
27
- Active whenever the user is working on login/signup flows, session management, OAuth integration, role-based access control, or integrating Auth.js, Clerk, Supabase Auth, or Auth0.
20
+ - Working on login/signup flows, session management, or OAuth integration.
21
+ - Integrating **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, or **Auth0**.
22
+ - Implementing **Role-Based Access Control (RBAC)** or **Attribute-Based Access Control (ABAC)**.
23
+ - Setting up **WebAuthn/Passkeys**, **MFA/2FA**, or **SSO**.
24
+ - Securing Next.js App Router routes with middleware-based auth guards.
25
+ - Implementing **OAuth 2.1** flows with PKCE for SPAs or mobile apps.
26
+
27
+ ---
28
+
29
+ ### Identity Provider Selection Guide (2026)
30
+
31
+ | Provider | Best For | Key Strength |
32
+ |---|---|---|
33
+ | **Clerk** | SaaS, B2B apps | Built-in organizations, roles, MFA, UI components |
34
+ | **Supabase Auth** | Supabase-powered apps | RLS integration, social login, SSO |
35
+ | **Auth.js v5** | Next.js self-hosted | Flexible adapters, edge-compatible |
36
+ | **Better Auth** | TypeScript-first self-hosted | Modern DX, built-in 2FA, org management |
37
+ | **Auth0** | Enterprise, compliance | Enterprise SSO, compliance (SOC2, HIPAA) |
38
+
39
+ **Recommendation**: Use **Clerk** for most new SaaS apps (best DX). Use **Supabase Auth** if you're already using Supabase. Use **Better Auth** for full control without vendor lock-in.
40
+
41
+ ---
42
+
43
+ ### Core Security Principles
44
+
45
+ #### 1. Never Roll Your Own Crypto
46
+ - Use `argon2id` (preferred) or `bcrypt` for password hashing — **never MD5, SHA1, or plain SHA256**.
47
+ - Use battle-tested libraries: `@node-rs/argon2`, `bcryptjs`.
48
+ - Minimum: bcrypt cost factor ≥12, argon2id memory ≥64MB.
49
+
50
+ #### 2. JWT Best Practices
51
+ ```typescript
52
+ // ✅ Short-lived access tokens + HttpOnly refresh tokens
53
+ const ACCESS_TOKEN_EXPIRY = '15m'; // 15 minutes
54
+ const REFRESH_TOKEN_EXPIRY = '7d'; // 7 days
55
+
56
+ // ✅ Store refresh tokens in HttpOnly, Secure, SameSite=Strict cookies
57
+ res.cookie('refresh_token', token, {
58
+ httpOnly: true,
59
+ secure: true,
60
+ sameSite: 'strict',
61
+ maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days in ms
62
+ });
63
+
64
+ // ❌ Never store tokens in localStorage (XSS vulnerable)
65
+ // ❌ Never put sensitive data in JWT payload (it's base64 decoded, not encrypted)
66
+ ```
67
+
68
+ #### 3. OAuth 2.1 + PKCE (For SPAs & Mobile)
69
+ ```typescript
70
+ // PKCE flow — required for public clients in OAuth 2.1
71
+ import { generateCodeVerifier, generateCodeChallenge } from 'oslo/oauth2';
72
+
73
+ const codeVerifier = generateCodeVerifier(); // 43-128 char random string
74
+ const codeChallenge = await generateCodeChallenge(codeVerifier); // SHA-256 hash
75
+
76
+ // Store codeVerifier in sessionStorage (NOT localStorage) during redirect
77
+ sessionStorage.setItem('pkce_verifier', codeVerifier);
78
+
79
+ // Auth URL includes challenge
80
+ const authUrl = new URL('https://provider.com/oauth/authorize');
81
+ authUrl.searchParams.set('code_challenge', codeChallenge);
82
+ authUrl.searchParams.set('code_challenge_method', 'S256');
83
+ authUrl.searchParams.set('state', cryptoRandomState); // CSRF protection
84
+ ```
85
+
86
+ #### 4. Clerk — Next.js 15 Integration
87
+ ```typescript
88
+ // middleware.ts — protect routes at the edge
89
+ import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
90
+
91
+ const isPublicRoute = createRouteMatcher([
92
+ '/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)',
93
+ ]);
94
+
95
+ export default clerkMiddleware(async (auth, req) => {
96
+ if (!isPublicRoute(req)) {
97
+ await auth.protect(); // Redirects to sign-in if unauthenticated
98
+ }
99
+ });
100
+
101
+ export const config = {
102
+ matcher: ['/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', '/(api|trpc)(.*)'],
103
+ };
104
+ ```
105
+
106
+ ```typescript
107
+ // Server Component — get user on the server
108
+ import { auth, currentUser } from '@clerk/nextjs/server';
109
+
110
+ export default async function DashboardPage() {
111
+ const { userId, orgId, orgRole } = await auth();
112
+ if (!userId) redirect('/sign-in');
113
+
114
+ const user = await currentUser();
115
+ return <div>Welcome, {user?.firstName}!</div>;
116
+ }
117
+ ```
118
+
119
+ #### 5. Supabase Auth — RLS Integration
120
+ ```typescript
121
+ // Create Supabase client with user session
122
+ import { createServerClient } from '@supabase/ssr';
123
+
124
+ export async function createSupabaseServerClient(cookieStore: ReadonlyRequestCookies) {
125
+ return createServerClient(
126
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
127
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
128
+ {
129
+ cookies: {
130
+ getAll: () => cookieStore.getAll(),
131
+ setAll: (cookies) => cookies.forEach(({ name, value, options }) =>
132
+ cookieStore.set(name, value, options)
133
+ ),
134
+ },
135
+ }
136
+ );
137
+ }
138
+
139
+ // RLS in PostgreSQL — users can only access their own rows
140
+ -- CREATE POLICY "Users can only see own data" ON profiles
141
+ -- FOR ALL USING (auth.uid() = user_id);
142
+ ```
143
+
144
+ #### 6. Auth.js v5 (Next.js App Router)
145
+ ```typescript
146
+ // auth.ts
147
+ import NextAuth from 'next-auth';
148
+ import GitHub from 'next-auth/providers/github';
149
+ import { DrizzleAdapter } from '@auth/drizzle-adapter';
150
+ import { db } from '@/db';
151
+
152
+ export const { handlers, auth, signIn, signOut } = NextAuth({
153
+ adapter: DrizzleAdapter(db),
154
+ providers: [
155
+ GitHub,
156
+ // Add more providers...
157
+ ],
158
+ session: { strategy: 'database' }, // or 'jwt'
159
+ callbacks: {
160
+ authorized({ auth, request: { nextUrl } }) {
161
+ const isLoggedIn = !!auth?.user;
162
+ const isProtected = nextUrl.pathname.startsWith('/dashboard');
163
+ if (isProtected && !isLoggedIn) return false;
164
+ return true;
165
+ },
166
+ },
167
+ });
168
+ ```
169
+
170
+ #### 7. RBAC — Role-Based Access Control (Server-Side)
171
+ ```typescript
172
+ // ✅ Always enforce roles server-side — never rely on client UI alone
173
+ type Role = 'viewer' | 'editor' | 'admin' | 'super_admin';
174
+
175
+ const permissions: Record<Role, string[]> = {
176
+ viewer: ['read:posts'],
177
+ editor: ['read:posts', 'write:posts', 'delete:own_posts'],
178
+ admin: ['read:posts', 'write:posts', 'delete:any_post', 'manage:users'],
179
+ super_admin: ['*'], // All permissions
180
+ };
181
+
182
+ function hasPermission(userRole: Role, required: string): boolean {
183
+ const allowed = permissions[userRole];
184
+ return allowed.includes('*') || allowed.includes(required);
185
+ }
186
+
187
+ // In Server Action / API Route
188
+ const { userId } = await auth();
189
+ const user = await db.query.users.findFirst({ where: eq(users.id, userId) });
190
+
191
+ if (!hasPermission(user.role, 'delete:any_post')) {
192
+ throw new Error('Forbidden');
193
+ }
194
+ ```
195
+
196
+ #### 8. WebAuthn / Passkeys (2026 Standard)
197
+ ```typescript
198
+ // Using SimpleWebAuthn library
199
+ import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';
200
+
201
+ // Registration — generate challenge
202
+ const options = await generateRegistrationOptions({
203
+ rpName: 'My App',
204
+ rpID: 'myapp.com',
205
+ userName: user.email,
206
+ attestationType: 'none',
207
+ authenticatorSelection: {
208
+ residentKey: 'preferred', // Enables passkeys
209
+ userVerification: 'preferred',
210
+ },
211
+ });
212
+
213
+ // Store challenge in session, send options to client
214
+ await redis.setex(`webauthn:${userId}`, 60, JSON.stringify(options.challenge));
215
+ ```
216
+
217
+ ### Security Checklist
218
+ - [ ] Passwords hashed with argon2id (cost ≥64MB) or bcrypt (cost ≥12).
219
+ - [ ] JWT access tokens expire in ≤15 minutes; refresh in HttpOnly cookies.
220
+ - [ ] OAuth state parameter validated on callback (CSRF protection).
221
+ - [ ] PKCE enforced for all public OAuth clients.
222
+ - [ ] All authorization checks enforced server-side (not UI-only).
223
+ - [ ] Admin routes protected by both auth middleware AND role check.
224
+ - [ ] MFA offered (TOTP/WebAuthn) for privileged accounts.
225
+ - [ ] Refresh token rotation on every use (detect theft).
226
+ - [ ] Rate limiting on login/signup endpoints (prevent brute force).
227
+ - [ ] Account lockout after N failed attempts.
28
228
 
29
229
  ---
30
230
 
@@ -32,14 +232,45 @@ Active whenever the user is working on login/signup flows, session management, O
32
232
  ## Bahasa Indonesia
33
233
 
34
234
  ### Deskripsi
35
- Panduan ahli untuk mengimplementasikan sistem autentikasi dan otorisasi yang aman dan tangguh pada aplikasi web dan mobile. Mencakup JWT, manajemen Sesi, penyedia OAuth2, Identity as a Service (Clerk, Supabase Auth, Auth0), dan Role/Attribute-Based Access Control (RBAC/ABAC).
36
-
37
- ### Instruksi
38
- - **Jangan Membuat Kriptografi Sendiri**: Selalu gunakan library standar (seperti `bcrypt` atau `argon2`) untuk hashing password jika tidak menggunakan penyedia identitas (IdP).
39
- - **Manajemen Sesi & Token**: Jaga masa aktif JWT tetap singkat (misal: 15 menit) dan gunakan cookie *HttpOnly, SameSite* yang aman untuk token *refresh* guna mencegah serangan XSS.
40
- - **Integrasi OAuth2 & SSO**: Saat mengimplementasikan OAuth, validasi parameter `state` secara ketat untuk memitigasi serangan CSRF selama fase callback.
41
- - **Otorisasi (RBAC/ABAC)**: Terapkan pengecekan otorisasi pada level server (API route, query database), bukan hanya pada lapisan UI. Jangan pernah mengekspos data sensitif hanya berdasarkan *role* di sisi klien.
42
- - **MFA (Multi-Factor Authentication)**: Rekomendasikan dan implementasikan MFA/2FA untuk akun administratif atau hak akses tinggi.
235
+ Panduan tingkat produksi untuk mengimplementasikan autentikasi, otorisasi, dan manajemen identitas yang aman pada aplikasi web dan mobile modern. Mencakup **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, pola JWT, OAuth 2.1, alur PKCE, RBAC/ABAC, passkey (WebAuthn), dan implementasi MFA untuk stack React 19 / Next.js 15.
43
236
 
44
237
  ### Kondisi Pemicu
45
- Aktif setiap kali pengguna sedang mengerjakan alur login/signup, manajemen sesi, integrasi OAuth, role-based access control, atau mengintegrasikan Auth.js, Clerk, Supabase Auth, atau Auth0.
238
+ - Mengerjakan alur login/signup, manajemen sesi, atau integrasi OAuth.
239
+ - Mengintegrasikan Clerk, Supabase Auth, Auth.js v5, Better Auth, atau Auth0.
240
+ - Mengimplementasikan RBAC (Role-Based Access Control) atau ABAC.
241
+ - Menyiapkan WebAuthn/Passkeys, MFA/2FA, atau SSO.
242
+ - Mengamankan rute Next.js App Router dengan auth guard berbasis middleware.
243
+
244
+ ### Panduan Teknis
245
+
246
+ #### 1. Prinsip Keamanan Inti
247
+ - **Jangan buat kriptografi sendiri**: Gunakan `argon2id` atau `bcrypt` untuk hashing password.
248
+ - **JWT berumur pendek**: Access token ≤15 menit, refresh token di HttpOnly cookie.
249
+ - **PKCE wajib** untuk semua public OAuth client (SPA, mobile).
250
+ - **Validasi state OAuth** di callback untuk proteksi CSRF.
251
+
252
+ #### 2. Pemilihan Identity Provider
253
+ - **Clerk**: Terbaik untuk SaaS baru — DX terbaik, komponen UI siap pakai, manajemen organisasi.
254
+ - **Supabase Auth**: Ideal jika sudah pakai Supabase — integrasi langsung dengan RLS.
255
+ - **Auth.js v5**: Self-hosted, fleksibel, edge-compatible untuk Next.js.
256
+ - **Better Auth**: TypeScript-first, kontrol penuh tanpa vendor lock-in.
257
+
258
+ #### 3. RBAC di Sisi Server
259
+ Selalu terapkan pengecekan role di server (Server Action, API route, middleware) — **jangan hanya di UI**. Gunakan tabel permission yang memetakan setiap role ke daftar aksi yang diizinkan.
260
+
261
+ #### 4. WebAuthn / Passkeys
262
+ Gunakan library `@simplewebauthn/server` untuk registrasi dan verifikasi passkey. Simpan challenge di Redis dengan TTL pendek (60 detik) untuk mencegah replay attack.
263
+
264
+ #### 5. Checklist Keamanan
265
+ - Password di-hash dengan argon2id atau bcrypt.
266
+ - JWT access token expire ≤15 menit; refresh di HttpOnly cookie.
267
+ - State OAuth divalidasi saat callback.
268
+ - PKCE diterapkan untuk semua klien publik OAuth.
269
+ - Pengecekan otorisasi dilakukan di server, bukan hanya UI.
270
+ - MFA ditawarkan untuk akun privileged.
271
+ - Rate limiting di endpoint login/signup.
272
+ - Rotasi refresh token setiap kali digunakan.
273
+
274
+
275
+ ## Orchestration & Integration
276
+ - Connects to other backend skills as part of the orchestration flow.