From abd9f950bbd95b9ad713a26d3fd8a7e0282b7c51 Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Fri, 20 Jun 2025 11:47:15 +0000
Subject: (김준회) SAML 2.0 SSO (Knox Portal) 추가
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 components/login/saml-login-button.tsx | 98 ++++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)
 create mode 100644 components/login/saml-login-button.tsx

(limited to 'components/login/saml-login-button.tsx')

diff --git a/components/login/saml-login-button.tsx b/components/login/saml-login-button.tsx
new file mode 100644
index 00000000..2f23bedf
--- /dev/null
+++ b/components/login/saml-login-button.tsx
@@ -0,0 +1,98 @@
+'use client'
+
+/**
+ * 
+ * SAML 2.0 기반 SSO 로그인 요청을 시작하는 버튼 컴포넌트
+ * 
+ * 
+ */
+
+import { useState } from 'react'
+import { Button } from '@/components/ui/button'
+import { toast } from '@/hooks/use-toast'
+import { Loader2, Shield } from 'lucide-react'
+import React from 'react'
+
+interface SAMLLoginButtonProps {
+  className?: string
+  children?: React.ReactNode
+  variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' | 'samsung'
+  size?: 'default' | 'sm' | 'lg' | 'icon'
+}
+
+export function SAMLLoginButton({ 
+  className, 
+  children = "Knox SSO로 로그인하기",
+  variant = "outline",
+  size = "default"
+}: SAMLLoginButtonProps) {
+  const [isLoading, setIsLoading] = useState(false)
+
+  const handleSAMLLogin = async () => {
+    try {
+      setIsLoading(true)
+
+      // API 엔드포인트를 통해 SAML AuthnRequest URL 생성
+      const response = await fetch('/api/auth/saml/authn-request', {
+        method: 'GET',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+      })
+
+      if (!response.ok) {
+        throw new Error('Failed to create SAML AuthnRequest')
+      }
+
+      const data = await response.json()
+      
+      if (!data.success || !data.loginUrl) {
+        throw new Error(data.error || 'Failed to get SAML login URL')
+      }
+      
+      console.log('SAML Login URL:', data.loginUrl)
+      
+      // IdP로 리다이렉트
+      window.location.href = data.loginUrl
+
+    } catch (error) {
+      console.error('SAML Login Error:', error)
+      toast({
+        title: '로그인 오류',
+        description: 'SAML 로그인을 시작할 수 없습니다.',
+        variant: 'destructive',
+      })
+      setIsLoading(false)
+    }
+  }
+
+  return (
+    <Button
+      type="button"
+      variant={variant}
+      size={size}
+      className={className}
+      onClick={handleSAMLLogin}
+      disabled={isLoading}
+    >
+      {isLoading ? (
+        <Loader2 className="h-4 w-4 animate-spin mr-2" />
+      ) : (
+        <Shield className="h-4 w-4 mr-2" />
+      )}
+      {children}
+    </Button>
+  )
+}
+
+// 간단한 Knox SSO 버튼 (props 없이)
+export function KnoxSSOButton() {
+  return (
+    <SAMLLoginButton 
+      className="w-full"
+      variant="outline"
+    >
+      Knox SSO (STAGE 단계)
+    </SAMLLoginButton>
+  )
+}
-- 
cgit v1.2.3

