import { NextRequest, NextResponse } from 'next/server'
// Mock IdP 엔드포인트 - SAML Response HTML 폼 반환
export async function GET(request: NextRequest) {
try {
// RelayState 파라미터 추출
const url = new URL(request.url)
const relayState = url.searchParams.get('RelayState') || 'mock_test'
console.log('🎭 Mock IdP endpoint accessed', { relayState });
// Mock SAML Response 데이터 (실제 형태와 일치하도록 문자열 형태)
const mockSAMLResponseData = {
nameID: "testuser@samsung.com",
nameIDFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:emailAddress",
attributes: {
email: "testuser@samsung.com",
name: "홍길동",
}
};
// Mock XML SAML Response 생성
const mockXML = `
MockIdP
MockIdP
${mockSAMLResponseData.nameID}
${mockSAMLResponseData.attributes.email}
${mockSAMLResponseData.attributes.name}
`.trim();
// Base64 인코딩
const encodedSAMLResponse = Buffer.from(mockXML, 'utf-8').toString('base64');
console.log("🎭 Mock SAML Response created:", {
nameID: mockSAMLResponseData.nameID,
email: mockSAMLResponseData.attributes.email,
name: mockSAMLResponseData.attributes.name,
encodedLength: encodedSAMLResponse.length
});
// 콜백 URL로 POST 요청을 시뮬레이션하는 HTML 폼 반환
const callbackUrl = `${process.env.NEXTAUTH_URL}/api/saml/callback`; // process.env.SAML_SP_CALLBACK_URL
const mockFormHTML = `
Mock SAML IdP
테스트 모드: 실제 IdP 대신 Mock 응답을 사용합니다.
실제 데이터 형태와 일치하도록 attributes를 문자열로 전송합니다.
테스트 사용자 정보:
- 이메일: ${mockSAMLResponseData.attributes.email}
- 이름: ${mockSAMLResponseData.attributes.name}
5초 후 자동으로 로그인을 진행합니다...
프로덕션 환경에서는 SAML_MOCKING_IDP=false로 설정하세요.
`;
return new NextResponse(mockFormHTML, {
headers: {
'Content-Type': 'text/html; charset=utf-8',
'Cache-Control': 'no-cache, no-store, must-revalidate'
}
});
} catch (error) {
console.error('💥 Mock IdP error:', error);
return NextResponse.json({
error: 'Mock IdP failed',
details: error instanceof Error ? error.message : 'Unknown error'
}, { status: 500 });
}
}