package idp import ( "baron-sso-backend/internal/domain" "baron-sso-backend/internal/service" "fmt" "log/slog" "os" "strings" ) // getEnv는 환경 변수를 읽거나 대체 값을 반환하는 헬퍼 함수입니다. func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback } // InitializeProvider는 환경 설정을 기반으로 IDP 공급자를 생성하고 반환합니다. // 이것은 IdentityProvider 인터페이스의 팩토리 역할을 합니다. func InitializeProvider() (domain.IdentityProvider, error) { rawProviders := getEnv("IDP_PROVIDER", "descope") // 기본값은 descope입니다. providers := strings.Split(rawProviders, ",") slog.Info("Initializing IDP", "providers", rawProviders) for _, p := range providers { providerName := strings.TrimSpace(strings.ToLower(p)) switch providerName { case "descope": descopeProjectID := getEnv("DESCOPE_PROJECT_ID", "") descopeManagementKey := getEnv("DESCOPE_MANAGEMENT_KEY", "") // 선택된 공급자에 대한 키가 설정되었는지 확인하기 위한 기본 유효성 검사 if descopeProjectID == "" || descopeManagementKey == "" { return nil, fmt.Errorf("DESCOPE_PROJECT_ID and DESCOPE_MANAGEMENT_KEY must be set for the 'descope' provider") } return service.NewDescopeProvider(descopeProjectID, descopeManagementKey), nil // --- 향후 공급자 구현 --- // case "ory": // // oryURL := getEnv("ORY_URL", "") // // if oryURL == "" { // // return nil, fmt.Errorf("ORY_URL must be set for the 'ory' provider") // // } // // return service.NewOryProvider(oryURL), nil // // return nil, fmt.Errorf(\"'ory' provider is not yet implemented\") // case "keycloak": // // keycloakURL := getEnv("KEYCLOAK_URL", "") // // keycloakRealm := getEnv("KEYCLOAK_REALM", "") // // if keycloakURL == "" || keycloakRealm == "" { // // return nil, fmt.Errorf("KEYCLOAK_URL and KEYCLOAK_REALM must be set for the 'keycloak' provider") // // } // // return service.NewKeycloakProvider(keycloakURL, keycloakRealm), nil // // return nil, fmt.Errorf(\"'keycloak' provider is not yet implemented\") default: // 알 수 없는 공급자는 건너뛰고 다음 후보를 시도 slog.Warn("Skipping unsupported IDP provider entry", "provider", providerName) } } return nil, fmt.Errorf("unsupported or unknown IDP_PROVIDER specified: %s", rawProviders) }