package domain import ( "errors" "net/http" "time" ) // ErrNotSupported는 IDP가 특정 인증 흐름을 지원하지 않을 때 반환합니다. var ErrNotSupported = errors.New("idp: not supported") // BrokerUser is the standard user model used within Baron SSO business logic. // It defines the canonical set of fields that must be supported by any underlying IDP. type BrokerUser struct { ID string `json:"id" required:"true"` Email string `json:"email" required:"true"` LoginID string `json:"login_id"` CustomLoginIDs []string `json:"custom_login_ids"` // [New] 다중 로그인 ID Name string `json:"name"` PhoneNumber string `json:"phone_number"` // Attributes stores custom user attributes. // The "required_keys" tag specifies which keys MUST be present in the IDP's schema support. Attributes map[string]any `json:"attributes" required_keys:"grade,department"` } // IDPMetadata represents the schema capabilities of an Identity Provider. type IDPMetadata struct { // SupportedFields lists the BrokerUser fields (json tag names) that the IDP supports. // For custom attributes, use the key name directly (e.g., "grade"). SupportedFields []string } // PasswordPolicy는 비밀번호 정책 정보를 표현합니다. type PasswordPolicy struct { MinLength int Lowercase bool Uppercase bool Number bool NonAlphanumeric bool MinCharacterTypes int } // Token represents a session or refresh token. type Token struct { JWT string Expiration time.Time SessionID string } // AuthInfo contains authentication information after a successful login. type AuthInfo struct { SessionToken *Token RefreshToken *Token // Subject는 IDP 세션이 대표하는 주체(예: Kratos identity.id)를 나타냅니다. Subject string SetCookies []*http.Cookie } // LinkLoginInit는 링크 로그인 초기화 결과입니다. type LinkLoginInit struct { FlowID string ExpiresAt time.Time // Mode는 링크 로그인 완료 후 세션 처리 방식입니다. (예: "cookie") Mode string // LoginID는 IDP에 실제 전달된 식별자입니다. LoginID string } // IdentityProvider is the interface that all IDP adapters must implement. type IdentityProvider interface { Name() string // GetMetadata returns the schema support information for this IDP. // This is used for startup-time validation. GetMetadata() (*IDPMetadata, error) // CreateUser는 BrokerUser 스키마를 기반으로 신규 사용자를 생성하고 주체 ID(예: identity.id)를 반환합니다. CreateUser(user *BrokerUser, password string) (string, error) // SignIn은 로그인 ID/비밀번호로 인증해 세션 정보를 반환합니다. SignIn(loginID, password string) (*AuthInfo, error) // UserExists는 loginID 기준으로 사용자 존재 여부를 확인합니다. UserExists(loginID string) (bool, error) // IssueSession은 비밀번호 없이 세션을 발급해야 하는 흐름에서 사용합니다. IssueSession(loginID string) (*AuthInfo, error) // InitiateLinkLogin은 링크 기반 로그인 요청을 IDP에 전달합니다. InitiateLinkLogin(loginID, returnTo string) (*LinkLoginInit, error) // VerifyLoginCode는 링크/코드 기반 로그인에서 코드를 제출해 세션을 발급합니다. VerifyLoginCode(loginID, flowID, code string) (*AuthInfo, error) // GetPasswordPolicy는 IDP가 제공하는 비밀번호 정책을 반환합니다. GetPasswordPolicy() (*PasswordPolicy, error) InitiatePasswordReset(loginID, redirectUrl string) error VerifyPasswordResetToken(token string) (*AuthInfo, error) UpdateUserPassword(loginID, newPassword string, r *http.Request) error }