diff --git a/backend/internal/idp/factory.go b/backend/internal/idp/factory.go new file mode 100644 index 00000000..6fa17872 --- /dev/null +++ b/backend/internal/idp/factory.go @@ -0,0 +1,56 @@ +package idp + +import ( + "baron-sso-backend/internal/domain" + "baron-sso-backend/internal/service" + "fmt" + "log/slog" + "os" +) + +// 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) { + providerName := getEnv("IDP_PROVIDER", "descope") // 기본값은 descope입니다. + slog.Info("Initializing IDP", "provider", providerName) + + 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: + return nil, fmt.Errorf("unsupported or unknown IDP_PROVIDER specified: %s", providerName) + } +}