import { authenticateWithSGips, verifyExternalCredentials } from "../auth/verifyCredentails"; import { SessionRepository } from "./repository"; import { isEmailWhitelisted } from "@/lib/email-whitelist/service"; // lib/session/helpers.ts - NextAuth 헬퍼 함수들 개선 export const authHelpers = { // 1차 인증 검증 및 임시 키 생성 (DB 버전) async performFirstAuth(username: string, password: string, provider: 'email' | 'sgips') { console.log('performFirstAuth started:', { username, provider }) try { let authResult; if (provider === 'sgips') { authResult = await authenticateWithSGips(username, password) } else { authResult = await verifyExternalCredentials(username, password) } if (!authResult.success) { return { success: false, error: authResult.error || 'INVALID_CREDENTIALS' } } // S-GIPS의 경우 otpUsers 배열 반환 if (provider === 'sgips' && authResult.otpUsers) { console.log('S-GIPS auth successful with otpUsers:', authResult.otpUsers.length) return { success: true, otpUsers: authResult.otpUsers } } // 일반 사용자의 경우 기존 로직 if (!authResult.user) { return { success: false, error: 'INVALID_CREDENTIALS' } } // 화이트리스트 체크하여 MFA 타입 결정 const isWhitelisted = await isEmailWhitelisted(authResult.user.email); const mfaType = isWhitelisted ? 'email' : 'sms'; console.log('Whitelist check:', { email: authResult.user.email, isWhitelisted, mfaType }); // DB에 임시 인증 세션 생성 const expiresAt = new Date(Date.now() + (10 * 60 * 1000)) // 10분 후 만료 const tempAuthKey = await SessionRepository.createTempAuthSession({ userId: authResult.user.id, email: authResult.user.email, authMethod: provider, expiresAt }) console.log('Temp auth stored in DB:', { tempAuthKey, userId: authResult.user.id, email: authResult.user.email, authMethod: provider, mfaType, expiresAt }) return { success: true, tempAuthKey, userId: authResult.user.id, email: authResult.user.email, mfaType, // 'email' 또는 'sms' userName: authResult.user.name, // Email OTP 전송 시 필요 } } catch (error) { console.error('First auth error:', error) return { success: false, error: 'SYSTEM_ERROR' } } }, // 임시 인증 정보 조회 (DB 버전) async getTempAuth(tempAuthKey: string) { return await SessionRepository.getTempAuthSession(tempAuthKey) }, // 임시 인증 정보 삭제 (DB 버전) async clearTempAuth(tempAuthKey: string) { await SessionRepository.markTempAuthSessionAsUsed(tempAuthKey) }, // 선택된 S-GIPS 사용자에 대한 임시 인증 세션 생성 async createTempAuthForSelectedUser(selectedUser: { userId: number; email: string; name: string; }) { console.log('Creating temp auth for selected S-GIPS user:', selectedUser) try { const expiresAt = new Date(Date.now() + (10 * 60 * 1000)) // 10분 후 만료 const tempAuthKey = await SessionRepository.createTempAuthSession({ userId: selectedUser.userId, email: selectedUser.email, authMethod: 'sgips', expiresAt }) console.log('Temp auth created for selected user:', { tempAuthKey, userId: selectedUser.userId, email: selectedUser.email, expiresAt }) return { success: true, tempAuthKey, userId: selectedUser.userId, email: selectedUser.email } } catch (error) { console.error('Error creating temp auth for selected user:', error) return { success: false, error: 'SYSTEM_ERROR' } } } }