#!/usr/bin/env node /** * Clerk JWT Template 설정 스크립트 * Clerk 대시보드에서 수동으로 설정해야 하는 내용들을 가이드합니다. */ import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); console.log("🔧 Clerk JWT Template 설정 가이드"); console.log("=====================================\n"); // 환경 변수 로드 import dotenv from "dotenv"; dotenv.config(); const CLERK_PUBLISHABLE_KEY = process.env.VITE_CLERK_PUBLISHABLE_KEY; const CLERK_SECRET_KEY = process.env.CLERK_SECRET_KEY; if (!CLERK_PUBLISHABLE_KEY || !CLERK_SECRET_KEY) { console.error( "❌ 오류: CLERK_PUBLISHABLE_KEY 또는 CLERK_SECRET_KEY가 설정되지 않았습니다." ); console.error(" .env 파일에 다음 변수들을 설정해주세요:"); console.error(" - VITE_CLERK_PUBLISHABLE_KEY"); console.error(" - CLERK_SECRET_KEY"); process.exit(1); } console.log("✅ 환경 변수 확인 완료"); console.log(`📋 Publishable Key: ${CLERK_PUBLISHABLE_KEY.substring(0, 20)}...`); console.log(`🔑 Secret Key: ${CLERK_SECRET_KEY.substring(0, 20)}...\n`); // JWT 템플릿 구성 const jwtTemplate = { name: "supabase", claims: { aud: "authenticated", role: "authenticated", email: "{{user.primary_email_address}}", email_verified: true, phone: "{{user.primary_phone_number}}", app_metadata: { provider: "clerk", providers: ["clerk"], }, user_metadata: { name: "{{user.full_name}}", username: "{{user.username}}", avatar_url: "{{user.image_url}}", }, }, lifetime: 3600, }; console.log("📝 Clerk 대시보드에서 다음 설정을 해주세요:"); console.log("============================================\n"); console.log("1. 🌐 Clerk 대시보드 접속"); console.log(" https://dashboard.clerk.com\n"); console.log("2. 📊 프로젝트 선택"); console.log(" 프로젝트: joint-cheetah-86\n"); console.log("3. 🔧 JWT Templates 섹션으로 이동"); console.log(' 좌측 메뉴에서 "JWT Templates" 클릭\n'); console.log("4. ➕ Create Template 클릭"); console.log(' "New Template" 또는 "Create Template" 버튼 클릭\n'); console.log("5. 📋 다음 JSON 설정 붙여넣기:"); console.log(" Template Name: supabase"); console.log(" JSON 설정:"); console.log("```json"); console.log(JSON.stringify(jwtTemplate, null, 2)); console.log("```\n"); console.log("6. 🌍 허용된 도메인 설정"); console.log(" Settings > Domains에서 다음 도메인 추가:"); console.log(" - http://localhost:3000 (개발 환경)"); console.log(" - http://localhost:3001 (개발 환경)"); console.log(" - https://zellyy-finance-psi.vercel.app (프로덕션)"); console.log(" - https://zellyy-finance.vercel.app (프로덕션)\n"); console.log("7. 🔄 Webhooks 설정 (선택사항)"); console.log(" Settings > Webhooks에서 다음 이벤트 추가:"); console.log(" - user.created"); console.log(" - user.updated"); console.log(" - user.deleted"); console.log( " Endpoint URL: https://zellyy-finance-psi.vercel.app/api/webhooks/clerk\n" ); // 현재 설정 확인을 위한 테스트 코드 생성 const testCode = ` // Clerk 설정 테스트 코드 import { useAuth } from '@clerk/clerk-react'; function TestClerkSetup() { const { getToken } = useAuth(); const testJWTTemplate = async () => { try { const token = await getToken({ template: 'supabase' }); console.log('✅ JWT 템플릿 테스트 성공:', token); } catch (error) { console.error('❌ JWT 템플릿 테스트 실패:', error); } }; return (
); } `; // 테스트 코드 파일 생성 fs.writeFileSync( path.join(__dirname, "..", "src", "components", "test", "ClerkSetupTest.tsx"), testCode ); console.log("📁 테스트 파일 생성 완료:"); console.log(" src/components/test/ClerkSetupTest.tsx\n"); console.log("⚡ 설정 완료 후 다음 명령어로 테스트:"); console.log(" npm run dev"); console.log(" 브라우저에서 http://localhost:3000 접속\n"); console.log("🎯 설정이 완료되면 다음 스크립트를 실행하세요:"); console.log(" node scripts/test-clerk-integration.js\n");