Documentation
¶
Index ¶
- Constants
- Variables
- func IsDevEnvironment(environment string) bool
- func WithSessionRevokeReason(ctx context.Context, reason SessionRevokeReason) context.Context
- type AdminListUsersResult
- type AdminUser
- type AuthEventLogReader
- type AuthEventLogger
- type AuthSessionEvent
- type Config
- type EmailSender
- type EntitlementsProvider
- type EphemeralMode
- type EphemeralStore
- type Keyset
- type Options
- type Org
- type OrgInvite
- type OrgMembership
- type OwnerNamespaceState
- type PendingRegistration
- type RegistrationVerificationPolicy
- type SMSSender
- type Service
- func (s *Service) AcceptOrgInvite(ctx context.Context, inviteID, userID string) error
- func (s *Service) AddMember(ctx context.Context, orgSlug, userID string) error
- func (s *Service) AdminDeleteUser(ctx context.Context, id string) error
- func (s *Service) AdminGetUser(ctx context.Context, id string) (*AdminUser, error)
- func (s *Service) AdminListUserSessions(ctx context.Context, userID string) ([]Session, error)
- func (s *Service) AdminListUsers(ctx context.Context, page, pageSize int, filter, search string, ...) (*AdminListUsersResult, error)
- func (s *Service) AdminRevokeUserSessions(ctx context.Context, userID string) error
- func (s *Service) AdminSetPassword(ctx context.Context, userID, new string) error
- func (s *Service) AssignRole(ctx context.Context, orgSlug, userID, role string) error
- func (s *Service) AssignRoleBySlug(ctx context.Context, userID, slug string) error
- func (s *Service) BanUser(ctx context.Context, userID string, reason *string, until *time.Time, ...) error
- func (s *Service) BeginPasswordReset(ctx context.Context, token string, sessionTTL time.Duration) (string, error)
- func (s *Service) ChangePassword(ctx context.Context, userID, current, new string, keepSessionID *string) error
- func (s *Service) CheckPendingRegistrationConflict(ctx context.Context, email, username string) (bool, bool, error)
- func (s *Service) CheckPhoneRegistrationConflict(ctx context.Context, phone, username string) (bool, bool, error)
- func (s *Service) ClaimOrgNamespace(ctx context.Context, slug, ownerUserID string) (orgID string, created bool, err error)
- func (s *Service) ClaimUserNamespace(ctx context.Context, slug string) (userID, orgID string, created bool, err error)
- func (s *Service) Clear2FAChallenge(ctx context.Context, userID string) error
- func (s *Service) ConfirmEmailChange(ctx context.Context, userID, code string) error
- func (s *Service) ConfirmEmailVerification(ctx context.Context, token string) (userID string, err error)
- func (s *Service) ConfirmPasswordReset(ctx context.Context, token, newPassword string) (string, error)
- func (s *Service) ConfirmPasswordResetWithSession(ctx context.Context, resetSession, newPassword string) (string, error)
- func (s *Service) ConfirmPendingPhoneRegistration(ctx context.Context, phone, code string) (userID string, err error)
- func (s *Service) ConfirmPendingPhoneRegistrationByToken(ctx context.Context, token string) (string, error)
- func (s *Service) ConfirmPendingRegistration(ctx context.Context, token string) (userID string, err error)
- func (s *Service) ConfirmPhoneChange(ctx context.Context, userID, phone, code string) error
- func (s *Service) ConfirmPhoneVerification(ctx context.Context, phone, code string) error
- func (s *Service) ConfirmPhoneVerificationByToken(ctx context.Context, token string) error
- func (s *Service) CountProviderLinks(ctx context.Context, userID string) int
- func (s *Service) Create2FAChallenge(ctx context.Context, userID string) (string, error)
- func (s *Service) CreateOrg(ctx context.Context, slug string) (*Org, error)
- func (s *Service) CreateOrgInvite(ctx context.Context, orgSlug, userID, invitedBy string, expiresAt *time.Time) (*OrgInvite, error)
- func (s *Service) CreatePendingPhoneRegistration(ctx context.Context, phone, username, passwordHash string) (string, error)
- func (s *Service) CreatePendingRegistration(ctx context.Context, email, username, passwordHash string, ttl time.Duration) (string, error)
- func (s *Service) CreateUser(ctx context.Context, email, username string) (*User, error)
- func (s *Service) DeclineOrgInvite(ctx context.Context, inviteID, userID string) error
- func (s *Service) DefineRole(ctx context.Context, orgSlug, role string) error
- func (s *Service) DeleteRole(ctx context.Context, orgSlug, role string) error
- func (s *Service) DeriveUsername(email string) string
- func (s *Service) DeriveUsernameForOAuth(ctx context.Context, provider, preferred, email, displayName string) string
- func (s *Service) Disable2FA(ctx context.Context, userID string) error
- func (s *Service) Enable2FA(ctx context.Context, userID, method string, phoneNumber *string) ([]string, error)
- func (s *Service) EntitlementsProvider() EntitlementsProvider
- func (s *Service) EphemeralMode() EphemeralMode
- func (s *Service) ExchangeRefreshToken(ctx context.Context, refreshToken string, ua string, ip net.IP) (idToken string, expiresAt time.Time, newRefresh string, err error)
- func (s *Service) ExchangeRefreshTokenWithOrg(ctx context.Context, refreshToken string, ua string, ip net.IP, org string) (idToken string, expiresAt time.Time, newRefresh string, err error)
- func (s *Service) GenerateAvailableUsername(ctx context.Context, base string) string
- func (s *Service) GenerateSIWSChallenge(ctx context.Context, cache siws.ChallengeCache, ...) (siws.SignInInput, error)
- func (s *Service) Get2FASettings(ctx context.Context, userID string) (*TwoFactorSettings, error)
- func (s *Service) GetDiscordUsername(ctx context.Context, userID string) (string, error)
- func (s *Service) GetEmailByUserID(ctx context.Context, id string) (string, error)
- func (s *Service) GetOrgMetadata(ctx context.Context, orgID string) (map[string]any, error)
- func (s *Service) GetOrgNamespaceState(ctx context.Context, orgID string) (OwnerNamespaceState, error)
- func (s *Service) GetOwnerNamespaceStateBySlug(ctx context.Context, slug string) (OwnerNamespaceState, error)
- func (s *Service) GetPendingEmailChange(ctx context.Context, userID string) (string, error)
- func (s *Service) GetPendingPhoneRegistrationByPhone(ctx context.Context, phone string) (*PendingRegistration, error)
- func (s *Service) GetPendingRegistrationByEmail(ctx context.Context, email string) (*PendingRegistration, error)
- func (s *Service) GetPersonalOrgForUser(ctx context.Context, userID string) (*Org, error)
- func (s *Service) GetProviderLink(ctx context.Context, providerSlug, subject string) (string, *string, error)
- func (s *Service) GetProviderLinkByIssuer(ctx context.Context, issuer, subject string) (string, *string, error)
- func (s *Service) GetProviderUsername(ctx context.Context, userID, provider string) (string, error)
- func (s *Service) GetSolanaAddress(ctx context.Context, userID string) (string, error)
- func (s *Service) GetUserByEmail(ctx context.Context, email string) (*User, error)
- func (s *Service) GetUserByPhone(ctx context.Context, phone string) (*User, error)
- func (s *Service) GetUserBySolanaAddress(ctx context.Context, address string) (*User, error)
- func (s *Service) GetUserByUsername(ctx context.Context, username string) (*User, error)
- func (s *Service) GetUserMetadata(ctx context.Context, userID string) (map[string]any, error)
- func (s *Service) HardDeleteUser(ctx context.Context, userID string) error
- func (s *Service) HasEmailSender() bool
- func (s *Service) HasPassword(ctx context.Context, userID string) bool
- func (s *Service) HasSMSSender() bool
- func (s *Service) HostDeleteUser(ctx context.Context, id string, soft bool) error
- func (s *Service) IsOrgMember(ctx context.Context, orgSlug, userID string) (bool, error)
- func (s *Service) IsOrgReserved(ctx context.Context, orgID string) (bool, error)
- func (s *Service) IsUserAllowed(ctx context.Context, userID string) (bool, error)
- func (s *Service) IsUserReserved(ctx context.Context, userID string) (bool, error)
- func (s *Service) IssueAccessToken(ctx context.Context, userID, email string, extra map[string]any) (token string, expiresAt time.Time, err error)
- func (s *Service) IssueOrgAccessToken(ctx context.Context, userID, email, orgSlug string, extra map[string]any) (token string, expiresAt time.Time, err error)
- func (s *Service) IssueRefreshSession(ctx context.Context, userID, userAgent string, ip net.IP) (sessionID, refreshToken string, expiresAt *time.Time, err error)
- func (s *Service) JWKS() jwtkit.JWKS
- func (s *Service) Keyfunc() func(token *jwt.Token) (any, error)
- func (s *Service) LinkProvider(ctx context.Context, userID, provider, subject string, email *string) error
- func (s *Service) LinkProviderByIssuer(ctx context.Context, userID, issuer, providerSlug, subject string, ...) error
- func (s *Service) LinkSolanaWallet(ctx context.Context, cache siws.ChallengeCache, userID string, ...) error
- func (s *Service) ListEntitlements(ctx context.Context, userID string) []string
- func (s *Service) ListEntitlementsDetailed(ctx context.Context, userID string) []entpg.Entitlement
- func (s *Service) ListOrgAliases(ctx context.Context, orgID string) ([]string, error)
- func (s *Service) ListOrgDefinedRoles(ctx context.Context, orgSlug string) ([]string, error)
- func (s *Service) ListOrgInvites(ctx context.Context, orgSlug, status string) ([]OrgInvite, error)
- func (s *Service) ListOrgMembers(ctx context.Context, orgSlug string) ([]string, error)
- func (s *Service) ListOrgMembershipsForUser(ctx context.Context, userID string) ([]string, error)
- func (s *Service) ListRoleSlugsByUser(ctx context.Context, userID string) []string
- func (s *Service) ListUserInvites(ctx context.Context, userID, status string) ([]OrgInvite, error)
- func (s *Service) ListUserOrgMembershipsAndRoles(ctx context.Context, userID string) ([]OrgMembership, error)
- func (s *Service) ListUserSessions(ctx context.Context, userID string) ([]Session, error)
- func (s *Service) ListUserSlugAliases(ctx context.Context, userID string) ([]string, error)
- func (s *Service) ListUsersDeletedBefore(ctx context.Context, cutoff time.Time, limit int) ([]string, error)
- func (s *Service) LogPasswordChanged(ctx context.Context, userID string, sessionID string, ip *string, ua *string)
- func (s *Service) LogPasswordRecovery(ctx context.Context, userID string, method, sessionID string, ip *string, ...)
- func (s *Service) LogSessionCreated(ctx context.Context, userID string, method string, sessionID string, ...)
- func (s *Service) LogSessionFailed(ctx context.Context, userID string, sessionID string, reason *string, ...)
- func (s *Service) Options() Options
- func (s *Service) ParkOrgNamespace(ctx context.Context, slug string) (orgID string, created bool, err error)
- func (s *Service) ParkUserNamespace(ctx context.Context, slug string) (userID, orgID string, created bool, err error)
- func (s *Service) PasswordLogin(ctx context.Context, email, pass string, extra map[string]any) (string, time.Time, error)
- func (s *Service) PasswordLoginByUserID(ctx context.Context, userID, pass string, extra map[string]any) (string, time.Time, error)
- func (s *Service) PatchOrgMetadata(ctx context.Context, orgID string, patch map[string]any) error
- func (s *Service) PatchUserMetadata(ctx context.Context, userID string, patch map[string]any) error
- func (s *Service) Postgres() *pgxpool.Pool
- func (s *Service) PromoteParkedOrgToRegistered(ctx context.Context, slug, ownerUserID string) (orgID string, err error)
- func (s *Service) PromoteReservedNameToRegistered(ctx context.Context, slug, ownerUserID string) (orgID string, created bool, err error)
- func (s *Service) PublicKeysByKID() map[string]*rsa.PublicKey
- func (s *Service) ReadMemberRoles(ctx context.Context, orgSlug, userID string) ([]string, error)
- func (s *Service) RegenerateBackupCodes(ctx context.Context, userID string) ([]string, error)
- func (s *Service) RemoveMember(ctx context.Context, orgSlug, userID string) error
- func (s *Service) RemoveRoleBySlug(ctx context.Context, userID, slug string) error
- func (s *Service) RenameOrgSlug(ctx context.Context, orgID, newSlug string) error
- func (s *Service) RequestEmailChange(ctx context.Context, userID, newEmail string) error
- func (s *Service) RequestEmailVerification(ctx context.Context, email string, ttl time.Duration) error
- func (s *Service) RequestPasswordReset(ctx context.Context, email string, ttl time.Duration) error
- func (s *Service) RequestPhoneChange(ctx context.Context, userID, newPhone string) error
- func (s *Service) RequestPhonePasswordReset(ctx context.Context, phone string, ttl time.Duration) error
- func (s *Service) RequestPhoneVerification(ctx context.Context, phone string, ttl time.Duration) error
- func (s *Service) Require2FAForLogin(ctx context.Context, userID string) (string, error)
- func (s *Service) ResendEmailChangeCode(ctx context.Context, userID string) error
- func (s *Service) ResendPhoneChangeCode(ctx context.Context, userID, phone string) error
- func (s *Service) ReserveAccount(ctx context.Context, slug string) (userID, orgID string, reserved bool, err error)
- func (s *Service) ResolveOrgBySlug(ctx context.Context, slug string) (*Org, error)
- func (s *Service) ResolveSessionByRefresh(ctx context.Context, refreshToken string) (string, error)
- func (s *Service) ResolveUserBySlug(ctx context.Context, slug string) (userID string, username string, err error)
- func (s *Service) RestoreUser(ctx context.Context, id string) error
- func (s *Service) RestrictOwnerNamespaceSlugs(ctx context.Context, slugs []string) (restricted []string, alreadyRestricted []string, err error)
- func (s *Service) RevokeAllSessions(ctx context.Context, userID string, keepSessionID *string) error
- func (s *Service) RevokeOrgInvite(ctx context.Context, orgSlug, inviteID string) error
- func (s *Service) RevokeSessionByID(ctx context.Context, sessionID string) error
- func (s *Service) RevokeSessionByIDForUser(ctx context.Context, userID, sessionID string) error
- func (s *Service) SendPhone2FASetupCode(ctx context.Context, userID, phone, code string) error
- func (s *Service) SendPhoneVerificationToUser(ctx context.Context, phone, userID string, ttl time.Duration) error
- func (s *Service) SendWelcome(ctx context.Context, userID string)
- func (s *Service) SetEmailVerified(ctx context.Context, id string, v bool) error
- func (s *Service) SetOrgNamespaceState(ctx context.Context, orgID string, state OwnerNamespaceState) error
- func (s *Service) SetProviderUsername(ctx context.Context, userID, provider, subject, username string) error
- func (s *Service) SoftDeleteUser(ctx context.Context, id string) error
- func (s *Service) UnassignRole(ctx context.Context, orgSlug, userID, role string) error
- func (s *Service) UnbanUser(ctx context.Context, userID string) error
- func (s *Service) UnlinkProvider(ctx context.Context, userID, provider string) error
- func (s *Service) UnrestrictOwnerNamespaceSlugs(ctx context.Context, slugs []string) (unrestricted []string, notRestricted []string, err error)
- func (s *Service) UpdateBiography(ctx context.Context, id string, bio *string) error
- func (s *Service) UpdateEmail(ctx context.Context, id, email string) error
- func (s *Service) UpdateUsername(ctx context.Context, id, username string) error
- func (s *Service) UpsertPasswordHash(ctx context.Context, userID, hash, algo string, params []byte) error
- func (s *Service) ValidateVerificationConfiguration() error
- func (s *Service) Verify2FAChallenge(ctx context.Context, userID, challenge string) (bool, error)
- func (s *Service) Verify2FACode(ctx context.Context, userID, code string) (bool, error)
- func (s *Service) VerifyBackupCode(ctx context.Context, userID, backupCode string) (bool, error)
- func (s *Service) VerifyPendingPassword(ctx context.Context, email, pass string) bool
- func (s *Service) VerifyPhone2FASetupCode(ctx context.Context, userID, phone, code string) (bool, error)
- func (s *Service) VerifySIWSAndLogin(ctx context.Context, cache siws.ChallengeCache, output siws.SignInOutput, ...) (accessToken string, expiresAt time.Time, refreshToken, userID string, ...)
- func (s *Service) VerifyUserPassword(ctx context.Context, userID, pass string) bool
- func (s *Service) WithAuthLogger(l AuthEventLogger) *Service
- func (s *Service) WithEmailSender(sender EmailSender) *Service
- func (s *Service) WithEntitlements(p EntitlementsProvider) *Service
- func (s *Service) WithEphemeralStore(store EphemeralStore, mode EphemeralMode) *Service
- func (s *Service) WithPostgres(pool *pgxpool.Pool) *Service
- func (s *Service) WithSMSSender(sender SMSSender) *Service
- type Session
- type SessionEventType
- type SessionRevokeReason
- type TwoFactorSettings
- type User
- type VerificationMessage
Constants ¶
const SolanaProviderSlug = "solana"
SolanaProviderSlug is the provider slug used for Solana wallets.
Variables ¶
var ( // ErrUserBanned indicates the account is blocked from authenticating. ErrUserBanned = errors.New("user_banned") // ErrUserNotFound indicates a user does not exist (or is not visible). ErrUserNotFound = errors.New("user_not_found") )
var ( ErrOrgNotFound = errors.New("org_not_found") ErrNotOrgMember = errors.New("not_org_member") ErrInvalidOrgSlug = errors.New("invalid_org_slug") ErrInvalidOrgRole = errors.New("invalid_org_role") ErrProtectedOrgRole = errors.New("protected_org_role") ErrLastOrgOwner = errors.New("cannot_remove_last_owner") ErrPersonalOrgOwner = errors.New("cannot_remove_personal_org_owner") )
var ( ErrOwnerSlugTaken = errors.New("owner_slug_taken") ErrPersonalOrgLocked = errors.New("personal_org_locked") ErrInviteNotFound = errors.New("org_invite_not_found") ErrInviteNotPending = errors.New("org_invite_not_pending") ErrInviteNotForUser = errors.New("org_invite_not_for_user") ErrInviteExpired = errors.New("org_invite_expired") ErrPersonalOrgNotFound = errors.New("personal_org_not_found") )
var ( ErrOwnerNamespaceNotFound = errors.New("owner_namespace_not_found") ErrInvalidOwnerNamespaceState = errors.New("invalid_owner_namespace_state") ErrInvalidOwnerNamespaceTransition = errors.New("invalid_owner_namespace_transition") ErrOwnerMembershipRequired = errors.New("owner_membership_required") ErrOwnerNamespaceAlreadyClaimed = errors.New("owner_namespace_already_claimed") ErrOwnerNamespaceBatchEmpty = errors.New("owner_namespace_batch_empty") )
var ( ErrReservedAccountNotFound = errors.New("reserved_account_not_found") ErrReservedAccountClaimed = errors.New("reserved_account_claimed") )
var ErrReservedRoleSlug = errors.New("reserved_role_slug")
Functions ¶
func IsDevEnvironment ¶
IsDevEnvironment reports whether a host-provided environment string is non-production.
func WithSessionRevokeReason ¶
func WithSessionRevokeReason(ctx context.Context, reason SessionRevokeReason) context.Context
WithSessionRevokeReason annotates ctx so revoke paths can emit a structured reason to the auth logger.
Types ¶
type AdminListUsersResult ¶
type AdminListUsersResult struct {
Users []AdminUser `json:"users"`
Total int64 `json:"total"`
Limit int `json:"limit"`
Offset int `json:"offset"`
}
AdminListUsersResult contains paginated user list with total count
type AdminUser ¶
type AdminUser struct {
ID string `json:"id"`
Email *string `json:"email"` // Nullable for phone-only users
PhoneNumber *string `json:"phone_number"`
Username *string `json:"username"`
DiscordUsername *string `json:"discord_username"`
EmailVerified bool `json:"email_verified"`
PhoneVerified bool `json:"phone_verified"`
BannedAt *time.Time `json:"banned_at,omitempty"`
BannedUntil *time.Time `json:"banned_until,omitempty"`
BanReason *string `json:"ban_reason,omitempty"`
BannedBy *string `json:"banned_by,omitempty"`
DeletedAt *time.Time `json:"deleted_at"`
Biography *string `json:"biography"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
LastLogin *time.Time `json:"last_login"`
Roles []string `json:"roles"`
Entitlements []string `json:"entitlements"`
}
Admin listing/get/delete
type AuthEventLogReader ¶ added in v0.4.2
type AuthEventLogReader interface {
// ListSessionEvents returns session events matching any of the given event types.
// If userID is empty, returns events for all users.
ListSessionEvents(ctx context.Context, userID string, eventTypes ...SessionEventType) ([]AuthSessionEvent, error)
}
AuthEventLogReader allows listing session events filtered by event types and optional userID.
type AuthEventLogger ¶
type AuthEventLogger interface {
LogSessionEvent(ctx context.Context, e AuthSessionEvent) error
}
type AuthSessionEvent ¶
type AuthSessionEvent struct {
OccurredAt time.Time
Issuer string
UserID string
SessionID string
Event SessionEventType
Method *string
Reason *string
IPAddr *string
UserAgent *string
}
AuthSessionEvent is a best-effort, append-only session lifecycle record intended for external sinks.
ClickHouse schema expectation (see migrations/clickhouse): - issuer, user_id, session_id, event are required - method is typically set for SessionEventCreated - reason is typically set for SessionEventRevoked
type Config ¶
type Config struct {
Issuer string
IssuedAudiences []string // JWT audiences - tokens issued will contain ALL of these audiences
ExpectedAudiences []string
AccessTokenDuration time.Duration
RefreshTokenDuration time.Duration
// Session limits
SessionMaxPerUser int // 0 = unlimited, default 3 if unset by service; eviction is always evict-oldest
// Optional: if set, used for building absolute URLs (e.g., password reset/verify links).
// If empty and Issuer is a well-formed URL, NewFromConfig defaults BaseURL to Issuer.
BaseURL string
// RegistrationVerification controls registration verification behavior.
// Valid values: "none", "optional", "required".
// Empty defaults to "none".
RegistrationVerification RegistrationVerificationPolicy
// OrgMode controls multi-organization behavior.
// Valid values: "single" (default) or "multi".
OrgMode string
// Environment is a host-provided runtime mode string used for dev/prod behavior checks.
// Expected values include "prod"/"production" for production, anything else is treated as non-prod.
Environment string
// SolanaNetwork is a host-provided Solana chain selector ("mainnet", "testnet", "devnet").
// If empty, AuthKit derives a default from Environment.
SolanaNetwork string
// Keys can be nil - if nil, authkit auto-discovers keys with this priority:
// 1. Environment variables (ACTIVE_KEY_ID, ACTIVE_PRIVATE_KEY_PEM, PUBLIC_KEYS)
// 2. Filesystem /vault/auth/keys.json (External Secrets Operator in K8s)
// 3. Auto-generated keys in .runtime/authkit/ (development fallback)
Keys jwtkit.KeySource
// Providers – identity providers by name ("google", "apple", "github", "discord").
// Only client id/secret are required; standard scopes are derived from defaults.
Providers map[string]oidckit.RPConfig
}
Config mirrors the simplicity of go-pkgz/auth: provide issuer, durations, and keys.
type EmailSender ¶
type EmailSender interface {
SendVerification(ctx context.Context, email, username string, msg VerificationMessage) error
SendPasswordResetLink(ctx context.Context, email, username, token string) error
SendLoginCode(ctx context.Context, email, username, code string) error
SendWelcome(ctx context.Context, email, username string) error
}
EmailSender sends verification/login/reset emails.
type EntitlementsProvider ¶
type EntitlementsProvider interface {
ListEntitlements(ctx context.Context, userID string) ([]entpg.Entitlement, error)
}
EntitlementsProvider returns application entitlements for a user (e.g., billing tiers).
type EphemeralMode ¶
type EphemeralMode string
const ( EphemeralMemory EphemeralMode = "memory" EphemeralRedis EphemeralMode = "redis" )
type EphemeralStore ¶
type EphemeralStore interface {
Get(ctx context.Context, key string) ([]byte, bool, error)
Set(ctx context.Context, key string, value []byte, ttl time.Duration) error
Del(ctx context.Context, key string) error
}
EphemeralStore is a minimal key-value interface used for short-lived auth state. Implementations should honor TTL on Set and treat missing keys as (found=false, err=nil).
type Options ¶
type Options struct {
Issuer string
IssuedAudiences []string // JWT audiences - tokens issued will contain ALL of these audiences
ExpectedAudiences []string
AccessTokenDuration time.Duration
RefreshTokenDuration time.Duration
SessionMaxPerUser int
// Optional link building (paths are fixed: /reset and /verify)
BaseURL string
// RegistrationVerification controls whether registration verification is disabled,
// non-blocking, or required.
RegistrationVerification RegistrationVerificationPolicy
// OrgMode controls multi-organization behavior.
// Valid values: "single" or "multi".
OrgMode string
// Environment is host-provided runtime mode used for dev/prod behavior checks.
Environment string
// SolanaNetwork is host-provided chain selector for SIWS flows.
SolanaNetwork string
}
Options configures issued tokens and identifiers.
func (Options) RegistrationVerificationEnabled ¶ added in v0.5.0
func (Options) RegistrationVerificationPolicy ¶ added in v0.5.0
func (o Options) RegistrationVerificationPolicy() RegistrationVerificationPolicy
func (Options) RegistrationVerificationRequired ¶ added in v0.5.0
type OrgInvite ¶ added in v0.4.6
type OrgInvite struct {
ID string `json:"id"`
Org string `json:"org"`
UserID string `json:"user_id"`
InvitedBy string `json:"invited_by"`
Status string `json:"status"`
ExpiresAt *time.Time `json:"expires_at,omitempty"`
ActedAt *time.Time `json:"acted_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type OrgMembership ¶ added in v0.4.4
OrgMembership is a user's membership with optional roles.
type OwnerNamespaceState ¶ added in v0.5.3
type OwnerNamespaceState string
const ( OwnerNamespaceStateRestrictedName OwnerNamespaceState = "restricted_name" OwnerNamespaceStateParkedOrg OwnerNamespaceState = "parked_org" OwnerNamespaceStateRegistered OwnerNamespaceState = "registered_org" )
type PendingRegistration ¶
PendingRegistration represents an unverified registration
type RegistrationVerificationPolicy ¶ added in v0.5.0
type RegistrationVerificationPolicy string
const ( RegistrationVerificationNone RegistrationVerificationPolicy = "none" RegistrationVerificationOptional RegistrationVerificationPolicy = "optional" RegistrationVerificationRequired RegistrationVerificationPolicy = "required" )
type SMSSender ¶
type SMSSender interface {
SendVerification(ctx context.Context, phone string, msg VerificationMessage) error
SendPasswordResetLink(ctx context.Context, phone, token string) error
SendLoginCode(ctx context.Context, phone, code string) error
}
SMSSender sends verification/login/reset SMS messages.
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service is the core auth service used by HTTP adapters.
func NewFromConfig ¶
NewFromConfig creates a Service from high-level Config + Stores. If Keys is nil, auto-discovers keys from environment variables, filesystem, or generates development keys.
func NewService ¶
func (*Service) AcceptOrgInvite ¶ added in v0.4.6
func (*Service) AdminDeleteUser ¶
func (*Service) AdminGetUser ¶
func (*Service) AdminListUserSessions ¶
Helper exposed for admin endpoints
func (*Service) AdminListUsers ¶
func (*Service) AdminRevokeUserSessions ¶
func (*Service) AdminSetPassword ¶
AdminSetPassword force-sets a user's password (admin only, no current password required)
func (*Service) AssignRole ¶ added in v0.4.4
func (*Service) AssignRoleBySlug ¶
Exported wrappers for admin endpoints
func (*Service) BanUser ¶
func (s *Service) BanUser(ctx context.Context, userID string, reason *string, until *time.Time, bannedBy string) error
BanUser disables a user account and stores ban metadata.
func (*Service) BeginPasswordReset ¶ added in v0.5.0
func (s *Service) BeginPasswordReset(ctx context.Context, token string, sessionTTL time.Duration) (string, error)
BeginPasswordReset validates and consumes a password reset token, then issues a short-lived one-time reset session for browser handoff.
func (*Service) ChangePassword ¶
func (s *Service) ChangePassword(ctx context.Context, userID, current, new string, keepSessionID *string) error
ChangePassword sets or changes a user's password. If the user already has a password, current must verify; otherwise current is ignored. Always Argon2id-hashes the new password and upserts it, then revokes all other sessions for the user; caller may keep one active session via keepSessionID.
func (*Service) CheckPendingRegistrationConflict ¶
func (s *Service) CheckPendingRegistrationConflict(ctx context.Context, email, username string) (bool, bool, error)
CheckPendingRegistrationConflict checks if email or username exists in users or pending registration cache. Returns (emailTaken, usernameTaken, error)
func (*Service) CheckPhoneRegistrationConflict ¶
func (s *Service) CheckPhoneRegistrationConflict(ctx context.Context, phone, username string) (bool, bool, error)
CheckPhoneRegistrationConflict checks if phone or username exists in users OR pending tables. Returns (phoneTaken, usernameTaken, error)
func (*Service) ClaimOrgNamespace ¶ added in v0.5.3
func (s *Service) ClaimOrgNamespace(ctx context.Context, slug, ownerUserID string) (orgID string, created bool, err error)
ClaimOrgNamespace claims org ownership for a specific existing user.
Rules:
- parked_org -> registered_org + owner membership assignment
- already-registered orgs return ErrOwnerNamespaceAlreadyClaimed
- restricted_name (or missing namespace) creates the org if needed, then claims it
- owner user must exist and not be soft-deleted
func (*Service) ClaimUserNamespace ¶ added in v0.6.0
func (s *Service) ClaimUserNamespace(ctx context.Context, slug string) (userID, orgID string, created bool, err error)
ClaimUserNamespace ensures a slug resolves to a non-reserved user namespace.
Behavior:
- If no same-slug user exists, creates one (and a personal org) and marks it claimed.
- Clears user reserved metadata and any restricted-name marker for the slug.
- Forces the user's personal org namespace state to registered_org when present.
- If a same-slug non-personal org exists, returns ErrInvalidOwnerNamespaceTransition.
func (*Service) Clear2FAChallenge ¶
Clear2FAChallenge removes the stored challenge after successful 2FA verification.
func (*Service) ConfirmEmailChange ¶
ConfirmEmailChange verifies the code and updates the user's email address. This is called when the user enters the verification code sent to their new email.
func (*Service) ConfirmEmailVerification ¶
func (s *Service) ConfirmEmailVerification(ctx context.Context, token string) (userID string, err error)
ConfirmEmailVerification verifies a token and marks email_verified = true. Returns the userID of the verified user.
func (*Service) ConfirmPasswordReset ¶
func (s *Service) ConfirmPasswordReset(ctx context.Context, token, newPassword string) (string, error)
ConfirmPasswordReset verifies token and sets a new password.
func (*Service) ConfirmPasswordResetWithSession ¶ added in v0.5.0
func (s *Service) ConfirmPasswordResetWithSession(ctx context.Context, resetSession, newPassword string) (string, error)
ConfirmPasswordResetWithSession consumes a reset session and sets the new password.
func (*Service) ConfirmPendingPhoneRegistration ¶
func (s *Service) ConfirmPendingPhoneRegistration(ctx context.Context, phone, code string) (userID string, err error)
ConfirmPendingPhoneRegistration verifies code and creates the actual user account. Implements "first to verify wins" - whoever verifies first gets the username/phone.
func (*Service) ConfirmPendingPhoneRegistrationByToken ¶ added in v0.5.0
func (s *Service) ConfirmPendingPhoneRegistrationByToken(ctx context.Context, token string) (string, error)
ConfirmPendingPhoneRegistrationByToken verifies a pending phone registration using either a manual code or a high-entropy link token.
func (*Service) ConfirmPendingRegistration ¶
func (s *Service) ConfirmPendingRegistration(ctx context.Context, token string) (userID string, err error)
ConfirmPendingRegistration verifies token and creates the actual user account. This implements "first to verify wins" - whoever verifies first gets the username/email.
func (*Service) ConfirmPhoneChange ¶
ConfirmPhoneChange verifies the code and updates the user's phone number. This is called when the user enters the verification code sent to their new phone.
func (*Service) ConfirmPhoneVerification ¶
ConfirmPhoneVerification verifies a token and marks phone_verified = true.
func (*Service) ConfirmPhoneVerificationByToken ¶ added in v0.5.0
ConfirmPhoneVerificationByToken verifies phone ownership using a one-click token.
func (*Service) CountProviderLinks ¶
Public wrappers
func (*Service) Create2FAChallenge ¶
Create2FAChallenge creates a short-lived challenge to prove password verification before 2FA.
func (*Service) CreateOrgInvite ¶ added in v0.4.6
func (*Service) CreatePendingPhoneRegistration ¶
func (s *Service) CreatePendingPhoneRegistration(ctx context.Context, phone, username, passwordHash string) (string, error)
CreatePendingPhoneRegistration creates a pending phone registration and sends SMS verification code. Returns 6-digit code for verification. Code expires in 10 minutes (shorter than email).
func (*Service) CreatePendingRegistration ¶
func (s *Service) CreatePendingRegistration(ctx context.Context, email, username, passwordHash string, ttl time.Duration) (string, error)
CreatePendingRegistration creates a pending registration and sends verification email. Returns token for verification. Allows duplicate pending registrations (last one wins).
func (*Service) CreateUser ¶
func (*Service) DeclineOrgInvite ¶ added in v0.4.6
func (*Service) DefineRole ¶ added in v0.4.4
func (*Service) DeleteRole ¶ added in v0.4.4
func (*Service) DeriveUsername ¶
func (*Service) DeriveUsernameForOAuth ¶
func (s *Service) DeriveUsernameForOAuth(ctx context.Context, provider, preferred, email, displayName string) string
DeriveUsernameForOAuth prefers provider-preferred usernames; falls back to email local part or display name.
func (*Service) Disable2FA ¶
Disable2FA disables two-factor authentication for a user
func (*Service) Enable2FA ¶
func (s *Service) Enable2FA(ctx context.Context, userID, method string, phoneNumber *string) ([]string, error)
Enable2FA enables two-factor authentication for a user and generates backup codes. Returns the plaintext backup codes (caller must show these to user ONCE).
func (*Service) EntitlementsProvider ¶
func (s *Service) EntitlementsProvider() EntitlementsProvider
func (*Service) EphemeralMode ¶
func (s *Service) EphemeralMode() EphemeralMode
func (*Service) ExchangeRefreshToken ¶
func (s *Service) ExchangeRefreshToken(ctx context.Context, refreshToken string, ua string, ip net.IP) (idToken string, expiresAt time.Time, newRefresh string, err error)
ExchangeRefreshToken rotates a refresh token and returns a new ID token + refresh token.
func (*Service) ExchangeRefreshTokenWithOrg ¶ added in v0.4.5
func (s *Service) ExchangeRefreshTokenWithOrg(ctx context.Context, refreshToken string, ua string, ip net.IP, org string) (idToken string, expiresAt time.Time, newRefresh string, err error)
ExchangeRefreshTokenWithOrg rotates a refresh token and returns a new access token + refresh token. If org is provided and org_mode=multi, it mints an org-scoped access token (org + roles for that org).
func (*Service) GenerateAvailableUsername ¶
GenerateAvailableUsername tries base, then minimal numeric suffixes, then a short fallback.
func (*Service) GenerateSIWSChallenge ¶
func (s *Service) GenerateSIWSChallenge(ctx context.Context, cache siws.ChallengeCache, domain, address, username string) (siws.SignInInput, error)
GenerateSIWSChallenge creates a new SIWS challenge for the given address. The challenge is stored in the cache and must be verified within 15 minutes.
func (*Service) Get2FASettings ¶
Get2FASettings retrieves a user's 2FA settings
func (*Service) GetDiscordUsername ¶
Convenience: Discord username
func (*Service) GetEmailByUserID ¶
func (*Service) GetOrgMetadata ¶ added in v0.4.8
func (*Service) GetOrgNamespaceState ¶ added in v0.5.3
func (*Service) GetOwnerNamespaceStateBySlug ¶ added in v0.5.3
func (*Service) GetPendingEmailChange ¶
GetPendingEmailChange retrieves the pending email change for a user, if any.
func (*Service) GetPendingPhoneRegistrationByPhone ¶
func (s *Service) GetPendingPhoneRegistrationByPhone(ctx context.Context, phone string) (*PendingRegistration, error)
GetPendingPhoneRegistrationByPhone looks up a pending phone registration by phone number.
func (*Service) GetPendingRegistrationByEmail ¶
func (s *Service) GetPendingRegistrationByEmail(ctx context.Context, email string) (*PendingRegistration, error)
GetPendingRegistrationByEmail looks up a pending registration by email.
func (*Service) GetPersonalOrgForUser ¶ added in v0.4.6
func (*Service) GetProviderLink ¶
func (s *Service) GetProviderLink(ctx context.Context, providerSlug, subject string) (string, *string, error)
Additional public helpers used by OIDC flow
func (*Service) GetProviderLinkByIssuer ¶
func (s *Service) GetProviderLinkByIssuer(ctx context.Context, issuer, subject string) (string, *string, error)
Issuer-based provider link helpers (preferred)
func (*Service) GetProviderUsername ¶
func (*Service) GetSolanaAddress ¶
GetSolanaAddress retrieves the Solana wallet address linked to a user, if any.
func (*Service) GetUserByEmail ¶
func (*Service) GetUserByPhone ¶
GetUserByPhone looks up a user by phone number.
func (*Service) GetUserBySolanaAddress ¶
GetUserBySolanaAddress looks up a user by their Solana wallet address.
func (*Service) GetUserByUsername ¶
func (*Service) GetUserMetadata ¶ added in v0.4.8
func (*Service) HardDeleteUser ¶
HardDeleteUser permanently deletes the user row and dependent AuthKit rows via ON DELETE CASCADE.
func (*Service) HasEmailSender ¶
HasEmailSender returns true if an email sender is configured.
func (*Service) HasPassword ¶
func (*Service) HasSMSSender ¶
HasSMSSender returns true if an SMS sender is configured.
func (*Service) HostDeleteUser ¶
HostDeleteUser performs deletion on behalf of the host application. If soft is true, it performs a soft delete (see SoftDeleteUser). If false, it hard-deletes the user and all dependent rows via ON DELETE CASCADE.
func (*Service) IsOrgMember ¶ added in v0.4.4
func (*Service) IsOrgReserved ¶ added in v0.4.8
func (*Service) IsUserAllowed ¶
func (*Service) IsUserReserved ¶ added in v0.5.3
func (*Service) IssueAccessToken ¶
func (s *Service) IssueAccessToken(ctx context.Context, userID, email string, extra map[string]any) (token string, expiresAt time.Time, err error)
IssueAccessToken builds and signs an access token (JWT) for the given user. Includes core registered claims plus: - roles (snapshot, org_mode=single only) - entitlements (snapshot) - email, username, discord_username (if available) Extra claims in `extra` are merged into the token body (e.g., sid).
func (*Service) IssueOrgAccessToken ¶ added in v0.4.4
func (s *Service) IssueOrgAccessToken(ctx context.Context, userID, email, orgSlug string, extra map[string]any) (token string, expiresAt time.Time, err error)
IssueOrgAccessToken builds and signs an org-scoped access token (JWT) for the given user. It is only valid in org_mode=multi, and only if the user is a member of the org. The token includes: - org (canonical slug) - roles (snapshot for that org)
func (*Service) IssueRefreshSession ¶
func (s *Service) IssueRefreshSession(ctx context.Context, userID, userAgent string, ip net.IP) (sessionID, refreshToken string, expiresAt *time.Time, err error)
IssueRefreshSession creates a session row and returns a new refresh token string.
func (*Service) Keyfunc ¶
Keyfunc looks up a public key by KID, falling back to the active key if missing.
func (*Service) LinkProvider ¶
func (*Service) LinkProviderByIssuer ¶
func (*Service) LinkSolanaWallet ¶
func (s *Service) LinkSolanaWallet(ctx context.Context, cache siws.ChallengeCache, userID string, output siws.SignInOutput) error
LinkSolanaWallet links a Solana wallet to an existing user account.
func (*Service) ListEntitlements ¶
ListEntitlements returns current entitlements for a user (fresh from provider).
func (*Service) ListEntitlementsDetailed ¶
ListEntitlementsDetailed returns detailed entitlements (name + metadata).
func (*Service) ListOrgAliases ¶ added in v0.4.6
func (*Service) ListOrgDefinedRoles ¶ added in v0.4.4
func (*Service) ListOrgInvites ¶ added in v0.4.6
func (*Service) ListOrgMembers ¶ added in v0.4.4
func (*Service) ListOrgMembershipsForUser ¶ added in v0.4.4
func (*Service) ListRoleSlugsByUser ¶
Public helpers for HTTP adapters
func (*Service) ListUserInvites ¶ added in v0.4.6
func (*Service) ListUserOrgMembershipsAndRoles ¶ added in v0.4.4
func (*Service) ListUserSessions ¶
ListUserSessions lists active sessions for a user and issuer.
func (*Service) ListUserSlugAliases ¶ added in v0.4.6
func (*Service) ListUsersDeletedBefore ¶
func (s *Service) ListUsersDeletedBefore(ctx context.Context, cutoff time.Time, limit int) ([]string, error)
ListUsersDeletedBefore returns user IDs for users soft-deleted before the cutoff. It is intended for retention/purge workflows in the host application.
func (*Service) LogPasswordChanged ¶ added in v0.4.2
func (s *Service) LogPasswordChanged(ctx context.Context, userID string, sessionID string, ip *string, ua *string)
LogPasswordChanged records a password change event for a user (best-effort).
func (*Service) LogPasswordRecovery ¶ added in v0.4.2
func (*Service) LogSessionCreated ¶
func (s *Service) LogSessionCreated(ctx context.Context, userID string, method string, sessionID string, ip *string, ua *string)
LogSessionCreated records a session creation event via the configured AuthEventLogger (best-effort).
func (*Service) LogSessionFailed ¶ added in v0.4.2
func (*Service) Options ¶
Options exposes immutable configuration for callers that need to validate claims.
func (*Service) ParkOrgNamespace ¶ added in v0.6.1
func (s *Service) ParkOrgNamespace(ctx context.Context, slug string) (orgID string, created bool, err error)
ParkOrgNamespace parks `slug` as a parked_org. Works whether or not the slug is currently in owner_reserved_names — any caller-supplied slug is parkable, even bootstrap-reserved names like 'root' or 'admin'. If a reserved-name row exists it's deleted as part of the transaction. Internal-library API only — not exposed publicly.
func (*Service) ParkUserNamespace ¶ added in v0.6.0
func (s *Service) ParkUserNamespace(ctx context.Context, slug string) (userID, orgID string, created bool, err error)
ParkUserNamespace ensures a slug is represented as a parked user namespace.
Behavior:
- If no same-slug user exists, creates a placeholder user (and personal org), then parks it.
- If a same-slug non-personal org exists, returns ErrInvalidOwnerNamespaceTransition.
- Requires the slug to be valid and available for user ownership semantics.
func (*Service) PasswordLogin ¶
func (s *Service) PasswordLogin(ctx context.Context, email, pass string, extra map[string]any) (string, time.Time, error)
PasswordLogin verifies credentials and issues an ID token.
func (*Service) PasswordLoginByUserID ¶
func (s *Service) PasswordLoginByUserID(ctx context.Context, userID, pass string, extra map[string]any) (string, time.Time, error)
PasswordLoginByUserID verifies credentials for a specific user ID and issues an ID token. This supports login flows where the identifier is a phone number or username and email may be NULL.
func (*Service) PatchOrgMetadata ¶ added in v0.4.8
func (*Service) PatchUserMetadata ¶ added in v0.4.8
func (*Service) PromoteParkedOrgToRegistered ¶ added in v0.5.3
func (*Service) PromoteReservedNameToRegistered ¶ added in v0.5.3
func (s *Service) PromoteReservedNameToRegistered(ctx context.Context, slug, ownerUserID string) (orgID string, created bool, err error)
PromoteReservedNameToRegistered supports direct handoff in one operation:
restricted_name -> parked_org -> registered_org
It is idempotent for already-registered orgs and optionally ensures owner membership.
func (*Service) PublicKeysByKID ¶ added in v0.6.0
PublicKeysByKID returns the public keys indexed by key ID.
func (*Service) ReadMemberRoles ¶ added in v0.4.4
func (*Service) RegenerateBackupCodes ¶
RegenerateBackupCodes generates new backup codes for a user (invalidating old ones). Returns the plaintext codes (caller must show these to user ONCE).
func (*Service) RemoveMember ¶ added in v0.4.4
func (*Service) RemoveRoleBySlug ¶
func (*Service) RenameOrgSlug ¶ added in v0.4.4
func (*Service) RequestEmailChange ¶
RequestEmailChange initiates an email change by sending a verification code to the new email. The current email is NOT changed until the user confirms via ConfirmEmailChange. Also sends a notification to the old email for security.
func (*Service) RequestEmailVerification ¶
func (s *Service) RequestEmailVerification(ctx context.Context, email string, ttl time.Duration) error
RequestEmailVerification creates a verification code and dispatches an email. Always returns 202-like behavior.
func (*Service) RequestPasswordReset ¶
RequestPasswordReset creates a password reset token and dispatches a reset link via email. Returns nil for unknown emails to prevent user enumeration (202-like behavior).
func (*Service) RequestPhoneChange ¶
RequestPhoneChange initiates a phone number change by sending a verification code to the new phone. The current phone is NOT changed until the user confirms via ConfirmPhoneChange.
func (*Service) RequestPhonePasswordReset ¶
func (s *Service) RequestPhonePasswordReset(ctx context.Context, phone string, ttl time.Duration) error
RequestPhonePasswordReset creates a password reset token and sends a reset link via SMS. Always returns nil for unknown phone numbers to prevent user enumeration (202-like behavior).
func (*Service) RequestPhoneVerification ¶
func (s *Service) RequestPhoneVerification(ctx context.Context, phone string, ttl time.Duration) error
RequestPhoneVerification looks up the user by phone number and sends a verification code. This mirrors the RequestEmailVerification pattern - caller only needs to provide the phone number. Always returns nil for security (prevents phone enumeration).
func (*Service) Require2FAForLogin ¶
Require2FAForLogin sends a 2FA code to the user's configured method. Returns the destination (email/phone) where the code was sent. This should be called after successful password verification.
func (*Service) ResendEmailChangeCode ¶
ResendEmailChangeCode resends the verification code for a pending email change.
func (*Service) ResendPhoneChangeCode ¶
ResendPhoneChangeCode resends the verification code for a pending phone change.
func (*Service) ReserveAccount ¶ added in v0.4.8
func (s *Service) ReserveAccount(ctx context.Context, slug string) (userID, orgID string, reserved bool, err error)
ReserveAccount reserves a namespace slug without requiring a same-slug login user. For legacy placeholder rows, it still enforces non-loginable reserved invariants.
func (*Service) ResolveOrgBySlug ¶ added in v0.4.4
ResolveOrgBySlug resolves an org by current slug or alias. Returns ErrOrgNotFound when no org matches.
func (*Service) ResolveSessionByRefresh ¶
ResolveSessionByRefresh finds the session id for a presented refresh token, if valid and active.
func (*Service) ResolveUserBySlug ¶ added in v0.4.6
func (*Service) RestoreUser ¶
RestoreUser clears deleted_at and re-enables the account.
func (*Service) RestrictOwnerNamespaceSlugs ¶ added in v0.5.3
func (s *Service) RestrictOwnerNamespaceSlugs(ctx context.Context, slugs []string) (restricted []string, alreadyRestricted []string, err error)
RestrictOwnerNamespaceSlugs adds slugs to the restricted-name blocklist. It is an admin operation separate from park/claim org lifecycle transitions.
func (*Service) RevokeAllSessions ¶
func (*Service) RevokeOrgInvite ¶ added in v0.4.6
func (*Service) RevokeSessionByID ¶
func (*Service) RevokeSessionByIDForUser ¶
RevokeSessionByIDForUser revokes a session by id ensuring it belongs to the user.
func (*Service) SendPhone2FASetupCode ¶
SendPhone2FASetupCode generates and sends a 6-digit code for 2FA setup to the user's phone.
func (*Service) SendPhoneVerificationToUser ¶
func (s *Service) SendPhoneVerificationToUser(ctx context.Context, phone, userID string, ttl time.Duration) error
SendPhoneVerificationToUser creates a verification code and sends it via SMS to a known user. Use RequestPhoneVerification if you only have a phone number and need to look up the user. Always returns nil for security.
func (*Service) SendWelcome ¶
SendWelcome triggers the welcome email if an EmailSender is configured.
func (*Service) SetEmailVerified ¶
func (*Service) SetOrgNamespaceState ¶ added in v0.5.3
func (*Service) SetProviderUsername ¶
func (*Service) SoftDeleteUser ¶
SoftDeleteUser marks the user deleted and sets deleted_at without dropping rows. Also revokes all refresh sessions for this issuer.
func (*Service) UnassignRole ¶ added in v0.4.4
func (*Service) UnlinkProvider ¶
func (*Service) UnrestrictOwnerNamespaceSlugs ¶ added in v0.5.3
func (s *Service) UnrestrictOwnerNamespaceSlugs(ctx context.Context, slugs []string) (unrestricted []string, notRestricted []string, err error)
UnrestrictOwnerNamespaceSlugs removes slugs from the restricted-name blocklist.
func (*Service) UpdateBiography ¶
func (*Service) UpdateEmail ¶
func (*Service) UpdateUsername ¶
func (*Service) UpsertPasswordHash ¶
func (*Service) ValidateVerificationConfiguration ¶ added in v0.5.0
ValidateVerificationConfiguration ensures registration verification policy can be satisfied by currently configured delivery senders.
func (*Service) Verify2FAChallenge ¶
Verify2FAChallenge verifies the challenge created during the password step.
func (*Service) Verify2FACode ¶
Verify2FACode verifies a 2FA code entered by the user during login. Returns true if code is valid, false otherwise.
func (*Service) VerifyBackupCode ¶
VerifyBackupCode verifies a 2FA backup code for account recovery. On success, removes the used backup code from the user's backup codes.
func (*Service) VerifyPendingPassword ¶
VerifyPendingPassword checks if the provided password matches the pending registration's hash. Returns true if password is correct, false otherwise.
func (*Service) VerifyPhone2FASetupCode ¶
func (s *Service) VerifyPhone2FASetupCode(ctx context.Context, userID, phone, code string) (bool, error)
VerifyPhone2FASetupCode checks the code for 2FA phone setup.
func (*Service) VerifySIWSAndLogin ¶
func (s *Service) VerifySIWSAndLogin(ctx context.Context, cache siws.ChallengeCache, output siws.SignInOutput, extra map[string]any) (accessToken string, expiresAt time.Time, refreshToken, userID string, created bool, err error)
VerifySIWSAndLogin verifies a SIWS signature and logs in or creates a user. Returns access token, expiry, refresh token, user ID, and whether a new user was created.
func (*Service) VerifyUserPassword ¶ added in v0.5.1
VerifyUserPassword checks a user's password without issuing tokens or updating last-login. Returns true if the password is correct, false otherwise.
func (*Service) WithAuthLogger ¶
func (s *Service) WithAuthLogger(l AuthEventLogger) *Service
WithAuthLogger sets the authentication event logger (e.g., ClickHouse sink).
func (*Service) WithEmailSender ¶
func (s *Service) WithEmailSender(sender EmailSender) *Service
WithEmailSender sets the email sender dependency.
func (*Service) WithEntitlements ¶
func (s *Service) WithEntitlements(p EntitlementsProvider) *Service
WithEntitlements sets the entitlements provider.
func (*Service) WithEphemeralStore ¶
func (s *Service) WithEphemeralStore(store EphemeralStore, mode EphemeralMode) *Service
func (*Service) WithPostgres ¶
WithPostgres attaches a pgx pool to the service.
func (*Service) WithSMSSender ¶
WithSMSSender sets the SMS sender dependency.
type Session ¶
type Session struct {
ID string
FamilyID string
CreatedAt time.Time
LastUsedAt time.Time
ExpiresAt *time.Time
RevokedAt *time.Time
UserAgent *string
IPAddr *string
}
Session represents a sanitized session view (no tokens).
type SessionEventType ¶
type SessionEventType string
SessionEventType identifies a session lifecycle event.
const ( SessionEventCreated SessionEventType = "session_created" SessionEventRevoked SessionEventType = "session_revoked" SessionEventPasswordChange SessionEventType = "password_changed" SessionEventPasswordRecovery SessionEventType = "password_recovery" SessionEventFailed SessionEventType = "session_failed" )
type SessionRevokeReason ¶
type SessionRevokeReason string
SessionRevokeReason identifies why a session (or set of sessions) was revoked.
const ( SessionRevokeReasonUnknown SessionRevokeReason = "" SessionRevokeReasonLogout SessionRevokeReason = "logout" SessionRevokeReasonUserRevoke SessionRevokeReason = "user_revoke" SessionRevokeReasonUserRevokeAll SessionRevokeReason = "user_revoke_all" SessionRevokeReasonAdminRevoke SessionRevokeReason = "admin_revoke" SessionRevokeReasonAdminRevokeAll SessionRevokeReason = "admin_revoke_all" SessionRevokeReasonPasswordChange SessionRevokeReason = "password_change" SessionRevokeReasonAdminSetPassword SessionRevokeReason = "admin_set_password" SessionRevokeReasonUserDisabled SessionRevokeReason = "user_disabled" SessionRevokeReasonBanned SessionRevokeReason = "banned" SessionRevokeReasonSoftDeleted SessionRevokeReason = "soft_deleted" SessionRevokeReasonEvicted SessionRevokeReason = "evicted" SessionRevokeReasonRefreshReuseDetected SessionRevokeReason = "refresh_reuse_detected" )
type TwoFactorSettings ¶
type TwoFactorSettings struct {
UserID string
Enabled bool
Method string // "email" or "sms"
PhoneNumber *string
BackupCodes []string // Hashed backup codes
CreatedAt time.Time
UpdatedAt time.Time
}
TwoFactorSettings represents a user's 2FA configuration
type User ¶
type User struct {
ID string
Email *string // Nullable - phone-only users have NULL email
PhoneNumber *string
Username *string
DiscordUsername *string
EmailVerified bool
PhoneVerified bool
BannedAt *time.Time
BannedUntil *time.Time
BanReason *string
BannedBy *string
DeletedAt *time.Time
Biography *string
CreatedAt time.Time
UpdatedAt time.Time
LastLogin *time.Time
}
type VerificationMessage ¶ added in v0.5.0
type VerificationMessage struct {
// Fixed-length numeric code for manual entry (optional).
Code string
// High-entropy token for one-click verification link flow (optional).
LinkToken string
}
func (VerificationMessage) Validate ¶ added in v0.5.0
func (m VerificationMessage) Validate() error