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.
- package/.github/workflows/publish.yml +20 -0
- package/AGENTS.md +66 -0
- package/BLUEPRINT.md +152 -60
- package/CHANGELOG.md +50 -0
- package/README.md +346 -194
- package/package.json +25 -25
- package/plugin.json +1 -1
- package/skills/ai-cost-token-optimizer/SKILL.md +52 -0
- package/skills/ai-llm-integration-expert/SKILL.md +180 -162
- package/skills/api-design-expert/SKILL.md +314 -310
- package/skills/app-analyzer-optimizer/SKILL.md +193 -189
- package/skills/apple-ecosystem-expert/SKILL.md +142 -0
- package/skills/async-queue-temporal-expert/SKILL.md +54 -0
- package/skills/authentication-identity-expert/SKILL.md +251 -20
- package/skills/auto-doc-updater/SKILL.md +214 -204
- package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
- package/skills/autonomous-red-teamer/SKILL.md +59 -0
- package/skills/autonomous-swarm-director/SKILL.md +69 -0
- package/skills/autonomous-tdd-debugger/SKILL.md +65 -0
- package/skills/bootstrap-to-modern/SKILL.md +90 -86
- package/skills/brainstorming/SKILL.md +373 -353
- package/skills/browser-automation-expert/SKILL.md +46 -0
- package/skills/ci-cd-devops-architect/SKILL.md +72 -45
- package/skills/cloud-hosting-expert/SKILL.md +244 -244
- package/skills/coderabbit/SKILL.md +192 -192
- package/skills/cron-scheduler-expert/SKILL.md +298 -0
- package/skills/data-telemetry-expert/SKILL.md +213 -213
- package/skills/database-orm-expert/SKILL.md +294 -294
- package/skills/dependency-upgrade-migrator/SKILL.md +295 -0
- package/skills/design-system-architect/SKILL.md +27 -10
- package/skills/doku-mcp-server/SKILL.md +251 -0
- package/skills/doku-payment-gateway/SKILL.md +227 -0
- package/skills/e2e-testing-expert/SKILL.md +315 -315
- package/skills/edge-serverless-db-expert/SKILL.md +43 -0
- package/skills/email-notification-expert/SKILL.md +362 -0
- package/skills/error-resilience-expert/SKILL.md +480 -0
- package/skills/event-driven-architect/SKILL.md +81 -81
- package/skills/feature-flag-analytics-expert/SKILL.md +46 -0
- package/skills/file-upload-media-expert/SKILL.md +431 -0
- package/skills/form-validation-expert/SKILL.md +401 -0
- package/skills/fullstack-expert/SKILL.md +202 -202
- package/skills/fullstack-expert/references/api_design_guide.md +466 -466
- package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
- package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
- package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
- package/skills/gemini-agent-booster/SKILL.md +135 -135
- package/skills/global-a11y-i18n-expert/SKILL.md +81 -81
- package/skills/glsl-shader-expert/SKILL.md +101 -0
- package/skills/go-programming-expert/SKILL.md +295 -295
- package/skills/graphql-apollo-expert/SKILL.md +108 -0
- package/skills/hig/SKILL.md +188 -188
- package/skills/hyper-context-synthesizer/SKILL.md +55 -0
- package/skills/js-backend-expert/SKILL.md +34 -9
- package/skills/legacy-code-translator/SKILL.md +65 -0
- package/skills/llm-cost-arbitrage-router/SKILL.md +59 -0
- package/skills/logging-error-tracking-expert/SKILL.md +338 -0
- package/skills/mcp-client-orchestrator/SKILL.md +70 -0
- package/skills/mcp-server-architect/SKILL.md +194 -194
- package/skills/micro-frontend-architect/SKILL.md +106 -0
- package/skills/mobile-expo-expert/SKILL.md +186 -186
- package/skills/mobile-push-notification-expert/SKILL.md +51 -0
- package/skills/monday-design-aesthetic/SKILL.md +67 -67
- package/skills/monorepo-architect/SKILL.md +227 -227
- package/skills/mpa-orchestrator/SKILL.md +101 -101
- package/skills/multi-agent-orchestration/SKILL.md +234 -234
- package/skills/multiple-entry-points/SKILL.md +55 -55
- package/skills/mvc-expert/SKILL.md +231 -231
- package/skills/payment-gateway-expert/SKILL.md +45 -45
- package/skills/performance-web-vitals/SKILL.md +332 -332
- package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
- package/skills/prd-architect/SKILL.md +201 -191
- package/skills/proactive-background-watcher/SKILL.md +62 -0
- package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
- package/skills/production-ready-hardener/SKILL.md +173 -186
- package/skills/production-ready-hardener/references/production_checklist.md +161 -161
- package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
- package/skills/project-context-mapper/SKILL.md +79 -0
- package/skills/python-programming-expert/SKILL.md +263 -132
- package/skills/rate-limit-abuse-prevention/SKILL.md +371 -0
- package/skills/realtime-collaboration-expert/SKILL.md +45 -45
- package/skills/rust-programming-expert/SKILL.md +235 -235
- package/skills/saas-billing/SKILL.md +377 -377
- package/skills/saas-multi-tenant/SKILL.md +251 -237
- package/skills/saas-mvp-launcher/SKILL.md +10 -0
- package/skills/saas-transformer/SKILL.md +187 -144
- package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
- package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
- package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
- package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
- package/skills/scalability-clean-code/SKILL.md +229 -229
- package/skills/self-evolving-memory-graph/SKILL.md +75 -0
- package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
- package/skills/senior-frontend/SKILL.md +161 -161
- package/skills/senior-fullstack/SKILL.md +167 -167
- package/skills/seo/SKILL.md +235 -225
- package/skills/seo-geo/SKILL.md +188 -188
- package/skills/session-context-loader/SKILL.md +77 -0
- package/skills/session-handoff-resume/SKILL.md +158 -158
- package/skills/skill_baru/SKILL.md +172 -147
- package/skills/spa-orchestrator/SKILL.md +288 -288
- package/skills/state-management-expert/SKILL.md +272 -272
- package/skills/supabase-security-expert/SKILL.md +243 -243
- package/skills/tailwind-expert/SKILL.md +188 -188
- package/skills/tanstack-query-expert/SKILL.md +199 -199
- package/skills/token-saver/SKILL.md +119 -111
- package/skills/typescript-expert/SKILL.md +324 -279
- package/skills/ui-components-expert/SKILL.md +263 -46
- package/skills/ui-ux-pro-max/SKILL.md +202 -201
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
- package/skills/ui_ux_expert/SKILL.md +17 -6
- package/skills/vector-db-rag-expert/SKILL.md +52 -0
- package/skills/vibe-code-gardener/SKILL.md +181 -173
- package/skills/visual-qa-vision-agent/SKILL.md +65 -0
- package/skills/vue-frontend-expert/SKILL.md +126 -0
- package/skills/web-3d-graphics-expert/SKILL.md +131 -0
- package/skills/web-game-engine-expert/SKILL.md +96 -0
- package/skills/web-scraper/SKILL.md +207 -205
- package/skills/website-design-cloner/SKILL.md +174 -0
- package/skills/webxr-ar-vr-expert/SKILL.md +117 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +206 -180
- package/skills/zero-trust-secret-vault/SKILL.md +40 -0
- 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:
|
|
4
|
+
author: vibes-plug-swarm
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Authentication & Identity Expert
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|