vibes-plug 2.11.0 → 3.9.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/.claude/rules/vibes-plug-core.md +5 -0
- package/.cursor/rules/vibes-plug-core.mdc +8 -3
- package/.cursorrules +9 -3
- package/AGENTS.md +25 -4
- package/CHANGELOG.md +151 -0
- package/CLAUDE.md +15 -8
- package/README.md +216 -641
- package/bin/vibes.mjs +1104 -0
- package/index.js +1 -1
- package/package.json +11 -3
- package/plugin.json +4 -3
- package/scripts/check-anti-slop.js +53 -0
- package/scripts/check-anti-slop.mjs +53 -0
- package/scripts/generate_swarm_gif.py +2 -2
- package/scripts/install.js +3 -1
- package/scripts/update_skills.js +1 -1
- package/scripts/update_skills.mjs +86 -0
- package/scripts/validate-skills.mjs +111 -0
- package/skills/accessibility-testing-expert/SKILL.md +117 -116
- package/skills/affective-computing-emotion-ai/SKILL.md +83 -0
- package/skills/agentic-coding-workflow-expert/SKILL.md +297 -0
- package/skills/agentic-memory-architect/SKILL.md +52 -0
- package/skills/agentic-micro-economy-architect/SKILL.md +92 -0
- package/skills/ai-llm-integration-expert/SKILL.md +330 -187
- package/skills/ai-media-generation-expert/SKILL.md +173 -172
- package/skills/ai-prompt-engineering-expert/SKILL.md +170 -50
- package/skills/ai-safety-governance-expert/SKILL.md +223 -0
- package/skills/angular-expert/SKILL.md +149 -148
- package/skills/anti-slop/SKILL.md +134 -0
- package/skills/api-design-expert/SKILL.md +4 -3
- package/skills/api-gateway-proxy-expert/SKILL.md +3 -2
- package/skills/app-analyzer-optimizer/SKILL.md +4 -3
- package/skills/apple-ecosystem-expert/SKILL.md +6 -5
- package/skills/astro-framework-expert/SKILL.md +201 -200
- package/skills/async-queue-temporal-expert/SKILL.md +218 -240
- package/skills/authentication-identity-expert/SKILL.md +79 -184
- package/skills/autonomous-red-teamer/SKILL.md +338 -203
- package/skills/autonomous-tdd-debugger/SKILL.md +6 -5
- package/skills/biome-linter-formatter-expert/SKILL.md +90 -89
- package/skills/blockchain-web3-expert/SKILL.md +116 -115
- package/skills/brainstorming/SKILL.md +392 -377
- package/skills/browser-automation-expert/SKILL.md +260 -222
- package/skills/bun-runtime-expert/SKILL.md +5 -4
- package/skills/chatbot-messaging-expert/SKILL.md +115 -114
- package/skills/ci-cd-devops-architect/SKILL.md +3 -2
- package/skills/cloud-hosting-expert/SKILL.md +5 -4
- package/skills/coderabbit/SKILL.md +5 -4
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +3 -2
- package/skills/composable-mach-architect/SKILL.md +338 -0
- package/skills/cron-scheduler-expert/SKILL.md +5 -4
- package/skills/data-pipeline-etl-expert/SKILL.md +3 -2
- package/skills/data-telemetry-expert/SKILL.md +5 -4
- package/skills/data-visualization-expert/SKILL.md +155 -154
- package/skills/database-orm-expert/SKILL.md +102 -240
- package/skills/deep-research-analyst/SKILL.md +182 -0
- package/skills/dependency-upgrade-migrator/SKILL.md +11 -10
- package/skills/design-system-architect/SKILL.md +34 -3
- package/skills/desktop-electron-expert/SKILL.md +129 -128
- package/skills/documentation-site-expert/SKILL.md +60 -59
- package/skills/doku-mcp-server/SKILL.md +5 -4
- package/skills/doku-payment-gateway/SKILL.md +250 -232
- package/skills/domain-driven-design-expert/SKILL.md +3 -2
- package/skills/e2e-testing-expert/SKILL.md +5 -4
- package/skills/ecommerce-expert/SKILL.md +88 -87
- package/skills/email-notification-expert/SKILL.md +35 -7
- package/skills/ephemeral-generative-ui-architect/SKILL.md +88 -0
- package/skills/error-resilience-expert/SKILL.md +26 -4
- package/skills/event-driven-architect/SKILL.md +5 -4
- package/skills/feature-flag-analytics-expert/SKILL.md +3 -2
- package/skills/file-upload-media-expert/SKILL.md +5 -4
- package/skills/firebase-security-expert/SKILL.md +5 -4
- package/skills/form-validation-expert/SKILL.md +7 -6
- package/skills/frontier-ai-models-expert/SKILL.md +116 -0
- package/skills/fullstack-expert/SKILL.md +68 -144
- package/skills/gemini-agent-booster/SKILL.md +248 -172
- package/skills/geospatial-maps-expert/SKILL.md +81 -80
- package/skills/global-a11y-i18n-expert/SKILL.md +5 -4
- package/skills/glsl-shader-expert/SKILL.md +155 -71
- package/skills/go-programming-expert/SKILL.md +5 -4
- package/skills/graph-rag-knowledge-expert/SKILL.md +201 -159
- package/skills/graphql-apollo-expert/SKILL.md +5 -4
- package/skills/headless-cms-expert/SKILL.md +182 -181
- package/skills/hig/SKILL.md +5 -4
- package/skills/js-backend-expert/SKILL.md +219 -218
- package/skills/legacy-code-translator/SKILL.md +6 -5
- package/skills/llm-finops-router/SKILL.md +52 -0
- package/skills/local-slm-edge-ai-expert/SKILL.md +168 -167
- package/skills/logging-error-tracking-expert/SKILL.md +5 -4
- package/skills/mcp-server-architect/SKILL.md +316 -294
- package/skills/micro-frontend-architect/SKILL.md +5 -4
- package/skills/mobile-expo-expert/SKILL.md +5 -4
- package/skills/modern-css-native-expert/SKILL.md +190 -189
- package/skills/monorepo-architect/SKILL.md +5 -4
- package/skills/mpa-orchestrator/SKILL.md +41 -4
- package/skills/multi-agent-orchestration/SKILL.md +388 -254
- package/skills/mvc-expert/SKILL.md +5 -4
- package/skills/n8n-automation-expert/SKILL.md +90 -89
- package/skills/nextjs-app-router-expert/SKILL.md +3 -2
- package/skills/openapi-swagger-codegen-expert/SKILL.md +4 -3
- package/skills/payment-gateway-expert/SKILL.md +131 -128
- package/skills/pdf-document-generation-expert/SKILL.md +92 -91
- package/skills/performance-web-vitals/SKILL.md +5 -4
- package/skills/post-quantum-crypto-migrator/SKILL.md +3 -2
- package/skills/prd-architect/SKILL.md +85 -109
- package/skills/proactive-background-watcher/SKILL.md +5 -4
- package/skills/production-ready-hardener/SKILL.md +25 -27
- package/skills/pwa-offline-first-expert/SKILL.md +227 -185
- package/skills/pydantic-ai-expert/SKILL.md +162 -0
- package/skills/python-programming-expert/SKILL.md +5 -4
- package/skills/rate-limit-abuse-prevention/SKILL.md +5 -4
- package/skills/realtime-collaboration-expert/SKILL.md +3 -2
- package/skills/rich-text-editor-expert/SKILL.md +178 -177
- package/skills/rust-programming-expert/SKILL.md +5 -4
- package/skills/saas-architect/SKILL.md +155 -0
- package/skills/saas-billing/SKILL.md +394 -382
- package/skills/saas-multi-tenant/SKILL.md +7 -6
- package/skills/scalability-clean-code/SKILL.md +5 -4
- package/skills/search-engine-expert/SKILL.md +90 -89
- package/skills/self-healing-cloud-orchestrator/SKILL.md +3 -2
- package/skills/senior-frontend/SKILL.md +21 -18
- package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
- package/skills/seo/SKILL.md +4 -4
- package/skills/session-memory-manager/SKILL.md +129 -0
- package/skills/solidjs-expert/SKILL.md +81 -80
- package/skills/spa-orchestrator/SKILL.md +5 -4
- package/skills/sse-websocket-streaming-expert/SKILL.md +3 -2
- package/skills/state-management-expert/SKILL.md +5 -4
- package/skills/supabase-security-expert/SKILL.md +5 -4
- package/skills/svelte-sveltekit-expert/SKILL.md +92 -91
- package/skills/svg-animation-motion-expert/SKILL.md +3 -2
- package/skills/synthetic-data-finetuning-expert/SKILL.md +156 -0
- package/skills/tailwind-expert/SKILL.md +62 -5
- package/skills/tanstack-query-expert/SKILL.md +5 -4
- package/skills/tauri-expert/SKILL.md +5 -4
- package/skills/typescript-expert/SKILL.md +5 -4
- package/skills/ui-ux-pro-max/SKILL.md +7 -4
- package/skills/vector-db-rag-expert/SKILL.md +209 -208
- package/skills/vercel-ai-sdk-expert/SKILL.md +226 -0
- package/skills/voice-ai-realtime-agent/SKILL.md +243 -202
- package/skills/vue-frontend-expert/SKILL.md +5 -4
- package/skills/wasm-edge-computing-expert/SKILL.md +3 -2
- package/skills/web-3d-graphics-expert/SKILL.md +259 -82
- package/skills/web-game-engine-expert/SKILL.md +278 -50
- package/skills/web-scraper/SKILL.md +158 -157
- package/skills/website-design-cloner/SKILL.md +5 -4
- package/skills/webxr-ar-vr-expert/SKILL.md +105 -65
- package/skills/wordpress-headless-expert/SKILL.md +145 -144
- package/skills/zero-tech-debt-auditor/SKILL.md +115 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +281 -227
- package/skills/zero-trust-secret-vault/SKILL.md +3 -2
- package/BLUEPRINT.md +0 -309
- package/skills/ai-cost-token-optimizer/SKILL.md +0 -82
- package/skills/ai-evals-benchmark-expert/SKILL.md +0 -188
- package/skills/asisten-ramah/SKILL.md +0 -47
- package/skills/auto-doc-updater/SKILL.md +0 -220
- package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
- package/skills/background-jobs-queue-expert/SKILL.md +0 -235
- package/skills/bootstrap-to-modern/SKILL.md +0 -94
- package/skills/database-migration-versioning-expert/SKILL.md +0 -90
- package/skills/edge-serverless-db-expert/SKILL.md +0 -99
- package/skills/mcp-client-orchestrator/SKILL.md +0 -76
- package/skills/mobile-push-notification-expert/SKILL.md +0 -71
- package/skills/monday-design-aesthetic/SKILL.md +0 -73
- package/skills/multiple-entry-points/SKILL.md +0 -91
- package/skills/project-context-mapper/SKILL.md +0 -85
- package/skills/saas-mvp-launcher/SKILL.md +0 -260
- package/skills/saas-transformer/SKILL.md +0 -500
- package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
- package/skills/secure-fuzz-testing/SKILL.md +0 -207
- package/skills/self-evolving-memory-graph/SKILL.md +0 -91
- package/skills/session-context-loader/SKILL.md +0 -83
- package/skills/session-handoff-resume/SKILL.md +0 -164
- package/skills/skill-baru/SKILL.md +0 -178
- package/skills/supabase-migration/SKILL.md +0 -91
- package/skills/token-saver/SKILL.md +0 -119
- package/skills/ui-components-expert/SKILL.md +0 -166
- package/skills/vibe-code-gardener/SKILL.md +0 -181
- package/skills/visual-qa-vision-agent/SKILL.md +0 -71
- /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
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: "Roedy Rustam"
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
version: "3.0.0"
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Authentication & Identity Expert (2026 Edition)
|
|
@@ -14,88 +15,73 @@ author: "Roedy Rustam"
|
|
|
14
15
|
## English
|
|
15
16
|
|
|
16
17
|
### Description
|
|
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
|
|
18
|
+
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.
|
|
18
19
|
|
|
19
20
|
### Trigger Conditions
|
|
20
|
-
- Working on login/signup flows, session management, or OAuth
|
|
21
|
-
- Integrating
|
|
22
|
-
- Implementing
|
|
23
|
-
- Setting up
|
|
21
|
+
- Working on login/signup flows, session management, or OAuth integrations.
|
|
22
|
+
- Integrating Clerk, Supabase Auth, Auth.js v5, Better Auth, or Auth0.
|
|
23
|
+
- Implementing RBAC (Role-Based Access Control) or ABAC.
|
|
24
|
+
- Setting up WebAuthn/Passkeys, MFA/2FA, or SSO.
|
|
24
25
|
- 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
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
### Identity Provider Selection Guide
|
|
29
|
+
### Identity Provider Selection Guide
|
|
30
30
|
|
|
31
|
-
| Provider | Best For | Key Strength |
|
|
32
|
-
|
|
33
|
-
| **Clerk** | SaaS
|
|
34
|
-
| **Supabase Auth** | Supabase
|
|
35
|
-
| **Auth.js v5** |
|
|
36
|
-
| **Better Auth** |
|
|
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.
|
|
31
|
+
| Provider | Best For | Key Strength | Pricing Model |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| **Clerk** | New SaaS products | Best developer DX, prebuilt UI components, orgs/teams out-of-the-box | Per MAU (free up to 10k) |
|
|
34
|
+
| **Supabase Auth** | Existing Supabase apps | Native RLS integration, multi-provider OAuth, generous free tier | Included with Supabase |
|
|
35
|
+
| **Auth.js v5** | Self-hosted control | Full data ownership, zero vendor lock-in, Edge-compatible | 100% Free / OSS |
|
|
36
|
+
| **Better Auth** | Modern TS-first apps | Comprehensive TypeScript plugin ecosystem, 2FA, passkeys | 100% Free / OSS |
|
|
40
37
|
|
|
41
38
|
---
|
|
42
39
|
|
|
43
|
-
###
|
|
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.
|
|
40
|
+
### Technical Guidelines & Recipes
|
|
49
41
|
|
|
50
|
-
####
|
|
42
|
+
#### 1. Password Hashing Standards
|
|
51
43
|
```typescript
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
44
|
+
import argon2 from 'argon2';
|
|
45
|
+
|
|
46
|
+
export async function hashPassword(password: string): Promise<string> {
|
|
47
|
+
return argon2.hash(password, {
|
|
48
|
+
type: argon2.argon2id,
|
|
49
|
+
memoryCost: 65536, // 64 MB
|
|
50
|
+
timeCost: 3,
|
|
51
|
+
parallelism: 4,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
```
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
#### 2. Short-Lived JWT + Refresh Token Rotation
|
|
57
|
+
```typescript
|
|
58
|
+
// Access token: 15 minutes, in memory
|
|
59
|
+
// Refresh token: 7-30 days, HttpOnly, Secure, SameSite=Strict cookie
|
|
66
60
|
```
|
|
67
61
|
|
|
68
|
-
#### 3. OAuth 2.1 + PKCE
|
|
62
|
+
#### 3. OAuth 2.1 + PKCE
|
|
69
63
|
```typescript
|
|
70
|
-
// PKCE flow — required for public clients in OAuth 2.1
|
|
71
64
|
import { generateCodeVerifier, generateCodeChallenge } from 'oslo/oauth2';
|
|
72
65
|
|
|
73
|
-
const codeVerifier = generateCodeVerifier();
|
|
74
|
-
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
75
|
-
|
|
76
|
-
// Store codeVerifier in sessionStorage (NOT localStorage) during redirect
|
|
66
|
+
const codeVerifier = generateCodeVerifier();
|
|
67
|
+
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
77
68
|
sessionStorage.setItem('pkce_verifier', codeVerifier);
|
|
78
69
|
|
|
79
|
-
// Auth URL includes challenge
|
|
80
70
|
const authUrl = new URL('https://provider.com/oauth/authorize');
|
|
81
71
|
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
82
72
|
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
83
|
-
authUrl.searchParams.set('state', cryptoRandomState);
|
|
73
|
+
authUrl.searchParams.set('state', cryptoRandomState);
|
|
84
74
|
```
|
|
85
75
|
|
|
86
76
|
#### 4. Clerk — Next.js 15 Integration
|
|
87
77
|
```typescript
|
|
88
|
-
// middleware.ts
|
|
78
|
+
// middleware.ts
|
|
89
79
|
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
|
|
90
80
|
|
|
91
|
-
const isPublicRoute = createRouteMatcher([
|
|
92
|
-
'/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)',
|
|
93
|
-
]);
|
|
81
|
+
const isPublicRoute = createRouteMatcher(['/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)']);
|
|
94
82
|
|
|
95
83
|
export default clerkMiddleware(async (auth, req) => {
|
|
96
|
-
if (!isPublicRoute(req))
|
|
97
|
-
await auth.protect(); // Redirects to sign-in if unauthenticated
|
|
98
|
-
}
|
|
84
|
+
if (!isPublicRoute(req)) await auth.protect();
|
|
99
85
|
});
|
|
100
86
|
|
|
101
87
|
export const config = {
|
|
@@ -103,47 +89,11 @@ export const config = {
|
|
|
103
89
|
};
|
|
104
90
|
```
|
|
105
91
|
|
|
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
92
|
#### 5. Supabase Auth — RLS Integration
|
|
120
|
-
|
|
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
|
-
```
|
|
93
|
+
> For detailed Supabase Auth SSR setup, PKCE session cookie handling, and PostgreSQL Row-Level Security (RLS) policies, delegate directly to `supabase-security-expert`.
|
|
143
94
|
|
|
144
95
|
#### 6. Auth.js v5 (Next.js App Router)
|
|
145
96
|
```typescript
|
|
146
|
-
// auth.ts
|
|
147
97
|
import NextAuth from 'next-auth';
|
|
148
98
|
import GitHub from 'next-auth/providers/github';
|
|
149
99
|
import { DrizzleAdapter } from '@auth/drizzle-adapter';
|
|
@@ -151,129 +101,74 @@ import { db } from '@/db';
|
|
|
151
101
|
|
|
152
102
|
export const { handlers, auth, signIn, signOut } = NextAuth({
|
|
153
103
|
adapter: DrizzleAdapter(db),
|
|
154
|
-
providers: [
|
|
155
|
-
|
|
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
|
-
},
|
|
104
|
+
providers: [GitHub],
|
|
105
|
+
session: { strategy: 'database' },
|
|
167
106
|
});
|
|
168
107
|
```
|
|
169
108
|
|
|
170
109
|
#### 7. RBAC — Role-Based Access Control (Server-Side)
|
|
171
110
|
```typescript
|
|
172
|
-
// ✅ Always enforce roles server-side — never rely on client UI alone
|
|
173
111
|
type Role = 'viewer' | 'editor' | 'admin' | 'super_admin';
|
|
174
112
|
|
|
175
113
|
const permissions: Record<Role, string[]> = {
|
|
176
114
|
viewer: ['read:posts'],
|
|
177
115
|
editor: ['read:posts', 'write:posts', 'delete:own_posts'],
|
|
178
116
|
admin: ['read:posts', 'write:posts', 'delete:any_post', 'manage:users'],
|
|
179
|
-
super_admin: ['*'],
|
|
117
|
+
super_admin: ['*'],
|
|
180
118
|
};
|
|
181
119
|
|
|
182
|
-
function hasPermission(userRole: Role, required: string): boolean {
|
|
183
|
-
const allowed = permissions[userRole];
|
|
120
|
+
export function hasPermission(userRole: Role, required: string): boolean {
|
|
121
|
+
const allowed = permissions[userRole] || [];
|
|
184
122
|
return allowed.includes('*') || allowed.includes(required);
|
|
185
123
|
}
|
|
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
124
|
```
|
|
195
125
|
|
|
196
126
|
#### 8. WebAuthn / Passkeys (2026 Standard)
|
|
197
127
|
```typescript
|
|
198
|
-
// Using SimpleWebAuthn library
|
|
199
128
|
import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';
|
|
200
129
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
residentKey: 'preferred',
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
// Store challenge in session, send options to client
|
|
214
|
-
await redis.setex(`webauthn:${userId}`, 60, JSON.stringify(options.challenge));
|
|
130
|
+
export async function getPasskeyRegistrationOptions(userId: string, userEmail: string) {
|
|
131
|
+
return generateRegistrationOptions({
|
|
132
|
+
rpName: 'My App',
|
|
133
|
+
rpID: 'myapp.com',
|
|
134
|
+
userID: new TextEncoder().encode(userId),
|
|
135
|
+
userName: userEmail,
|
|
136
|
+
attestationType: 'none',
|
|
137
|
+
authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },
|
|
138
|
+
});
|
|
139
|
+
}
|
|
215
140
|
```
|
|
216
141
|
|
|
217
|
-
### Security Checklist
|
|
218
|
-
- [ ] Passwords hashed with argon2id
|
|
219
|
-
- [ ] JWT access
|
|
220
|
-
- [ ] OAuth state parameter validated on callback (CSRF protection).
|
|
142
|
+
### Production Security Checklist
|
|
143
|
+
- [ ] Passwords hashed with argon2id or bcrypt (cost >= 12).
|
|
144
|
+
- [ ] JWT access token expires in <= 15 minutes; refresh token in HttpOnly cookie.
|
|
221
145
|
- [ ] PKCE enforced for all public OAuth clients.
|
|
222
|
-
- [ ]
|
|
223
|
-
- [ ]
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
-
|
|
227
|
-
- [ ] Account lockout after N failed attempts.
|
|
146
|
+
- [ ] Authorization enforced on server actions and API routes (never UI only).
|
|
147
|
+
- [ ] Rate limiting on login and signup endpoints.
|
|
148
|
+
|
|
149
|
+
## Orchestration & Integration
|
|
150
|
+
- Connects with `supabase-security-expert`, `saas-architect`, `js-backend-expert`, `firebase-security-expert`, and `production-ready-hardener`.
|
|
228
151
|
|
|
229
152
|
---
|
|
230
153
|
|
|
231
154
|
<a name="bahasa-indonesia"></a>
|
|
232
155
|
## Bahasa Indonesia
|
|
233
156
|
|
|
234
|
-
### Integrasi Orkestrasi
|
|
235
|
-
Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
|
|
236
|
-
|
|
237
157
|
### Deskripsi
|
|
238
|
-
Panduan tingkat produksi untuk
|
|
239
|
-
|
|
240
|
-
###
|
|
241
|
-
-
|
|
242
|
-
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
#### 2. Pemilihan Identity Provider
|
|
256
|
-
- **Clerk**: Terbaik untuk SaaS baru — DX terbaik, komponen UI siap pakai, manajemen organisasi.
|
|
257
|
-
- **Supabase Auth**: Ideal jika sudah pakai Supabase — integrasi langsung dengan RLS.
|
|
258
|
-
- **Auth.js v5**: Self-hosted, fleksibel, edge-compatible untuk Next.js.
|
|
259
|
-
- **Better Auth**: TypeScript-first, kontrol penuh tanpa vendor lock-in.
|
|
260
|
-
|
|
261
|
-
#### 3. RBAC di Sisi Server
|
|
262
|
-
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.
|
|
263
|
-
|
|
264
|
-
#### 4. WebAuthn / Passkeys
|
|
265
|
-
Gunakan library `@simplewebauthn/server` untuk registrasi dan verifikasi passkey. Simpan challenge di Redis dengan TTL pendek (60 detik) untuk mencegah replay attack.
|
|
266
|
-
|
|
267
|
-
#### 5. Checklist Keamanan
|
|
268
|
-
- Password di-hash dengan argon2id atau bcrypt.
|
|
269
|
-
- JWT access token expire ≤15 menit; refresh di HttpOnly cookie.
|
|
270
|
-
- State OAuth divalidasi saat callback.
|
|
271
|
-
- PKCE diterapkan untuk semua klien publik OAuth.
|
|
272
|
-
- Pengecekan otorisasi dilakukan di server, bukan hanya UI.
|
|
273
|
-
- MFA ditawarkan untuk akun privileged.
|
|
274
|
-
- Rate limiting di endpoint login/signup.
|
|
275
|
-
- Rotasi refresh token setiap kali digunakan.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
## Orchestration & Integration
|
|
279
|
-
- Connects to other backend skills as part of the orchestration flow.
|
|
158
|
+
Panduan tingkat produksi untuk autentikasi, otorisasi, dan manajemen identitas modern (Clerk, Supabase Auth, Auth.js v5, Better Auth, OAuth 2.1 PKCE, RBAC, dan Passkeys).
|
|
159
|
+
|
|
160
|
+
### Rekomendasi Identity Provider
|
|
161
|
+
- **Clerk**: Terbaik untuk SaaS baru (UI bawaan, manajemen tim/organisasi).
|
|
162
|
+
- **Supabase Auth**: Terbaik jika memakai database Supabase (integrasi native RLS).
|
|
163
|
+
- **Auth.js v5**: Self-hosted, kontrol penuh tanpa vendor lock-in.
|
|
164
|
+
- **Better Auth**: TypeScript-first, fitur 2FA dan passkey bawaan.
|
|
165
|
+
|
|
166
|
+
### Poin Kunci Keamanan
|
|
167
|
+
1. **Password Hashing**: Gunakan `argon2id` atau `bcrypt` (cost >= 12).
|
|
168
|
+
2. **Token Berumur Pendek**: Access token <= 15 menit, refresh token di cookie HttpOnly dengan rotasi token.
|
|
169
|
+
3. **PKCE Wajib**: Terapkan PKCE untuk semua klien publik OAuth.
|
|
170
|
+
4. **Otorisasi Server-Side**: Wajibkan verifikasi hak akses di server (bukan hanya UI).
|
|
171
|
+
5. **Supabase Auth**: Untuk setup SSR dan RLS mendalam, delegasikan ke `supabase-security-expert`.
|
|
172
|
+
|
|
173
|
+
## Integrasi Orkestrasi
|
|
174
|
+
- Terhubung dengan `supabase-security-expert`, `saas-architect`, `js-backend-expert`, `firebase-security-expert`, dan `production-ready-hardener`.
|