forked from baron/baron-sso
89 lines
3.5 KiB
Go
89 lines
3.5 KiB
Go
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"`
|
|
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]interface{} `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
|
|
}
|
|
|
|
// AuthInfo contains authentication information after a successful login.
|
|
type AuthInfo struct {
|
|
SessionToken *Token
|
|
RefreshToken *Token
|
|
// Subject는 IDP 세션이 대표하는 주체(예: Kratos identity.id)를 나타냅니다.
|
|
Subject string
|
|
}
|
|
|
|
// 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
|
|
}
|