models

package
v1.3.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 17, 2025 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Index

Constants

View Source
const (
	EventUserSignedUp    = "user.signed_up"
	EventUserLoggedIn    = "user.logged_in"
	EventEmailVerified   = "user.email_verified"
	EventPasswordChanged = "user.password_changed"
	EventEmailChanged    = "user.email_changed"
)

Built-in event types for the authentication system

View Source
const (
	RateLimitAlgorithmFixedWindow = "fixed_window"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Account

type Account struct {
	ID                    string       `json:"id" gorm:"primaryKey"`
	UserID                string       `json:"user_id" gorm:"index"`
	AccountID             string       `json:"account_id"`
	ProviderID            ProviderType `json:"provider_id"`
	AccessToken           *string      `json:"access_token,omitempty"`
	RefreshToken          *string      `json:"refresh_token,omitempty"`
	IDToken               *string      `json:"id_token,omitempty"`
	AccessTokenExpiresAt  *time.Time   `json:"access_token_expires_at,omitempty"`
	RefreshTokenExpiresAt *time.Time   `json:"refresh_token_expires_at,omitempty"`
	Scope                 *string      `json:"scope,omitempty"`
	Password              *string      `json:"password,omitempty"` // for email/password auth
	CreatedAt             time.Time    `json:"created_at"`
	UpdatedAt             time.Time    `json:"updated_at"`
	User                  User         `gorm:"foreignKey:UserID"`
}

type AccountDatabaseHooksConfig

type AccountDatabaseHooksConfig struct {
	BeforeCreate func(account *Account) error
	AfterCreate  func(account Account) error
	BeforeUpdate func(account *Account) error
	AfterUpdate  func(account Account) error
}

type AccountService

type AccountService interface {
	CreateAccount(account *Account) error
	GetAccountByUserID(userID string) (*Account, error)
	GetAccountByProviderAndAccountID(provider ProviderType, accountID string) (*Account, error)
	UpdateAccount(account *Account) error
}

type Api

type Api struct {
	Users         UserService
	Accounts      AccountService
	Sessions      SessionService
	Verifications VerificationService
	Tokens        TokenService
	RateLimit     RateLimitService
}

type BasePlugin added in v1.3.4

type BasePlugin struct {
	// contains filtered or unexported fields
}

func (*BasePlugin) Close added in v1.3.4

func (p *BasePlugin) Close() error

func (*BasePlugin) Config added in v1.3.4

func (p *BasePlugin) Config() PluginConfig

func (*BasePlugin) Ctx added in v1.3.4

func (p *BasePlugin) Ctx() *PluginContext

func (*BasePlugin) DatabaseHooks added in v1.3.4

func (p *BasePlugin) DatabaseHooks() any

func (*BasePlugin) EventHooks added in v1.3.4

func (p *BasePlugin) EventHooks() any

func (*BasePlugin) Init added in v1.3.4

func (p *BasePlugin) Init(ctx *PluginContext) error

func (*BasePlugin) Metadata added in v1.3.4

func (p *BasePlugin) Metadata() PluginMetadata

func (*BasePlugin) Migrations added in v1.3.4

func (p *BasePlugin) Migrations() []any

func (*BasePlugin) RateLimit added in v1.3.4

func (p *BasePlugin) RateLimit() *PluginRateLimit

func (*BasePlugin) Routes added in v1.3.4

func (p *BasePlugin) Routes() []PluginRoute

func (*BasePlugin) SetClose added in v1.3.4

func (p *BasePlugin) SetClose(fn func() error)

func (*BasePlugin) SetConfig added in v1.3.4

func (p *BasePlugin) SetConfig(config PluginConfig)

func (*BasePlugin) SetCtx added in v1.3.4

func (p *BasePlugin) SetCtx(ctx *PluginContext)

func (*BasePlugin) SetDatabaseHooks added in v1.3.4

func (p *BasePlugin) SetDatabaseHooks(hooks any)

func (*BasePlugin) SetEventHooks added in v1.3.4

func (p *BasePlugin) SetEventHooks(hooks any)

func (*BasePlugin) SetInit added in v1.3.4

func (p *BasePlugin) SetInit(fn func(ctx *PluginContext) error)

func (*BasePlugin) SetMetadata added in v1.3.4

func (p *BasePlugin) SetMetadata(meta PluginMetadata)

func (*BasePlugin) SetMigrations added in v1.3.4

func (p *BasePlugin) SetMigrations(migrations []any)

func (*BasePlugin) SetRateLimit added in v1.3.4

func (p *BasePlugin) SetRateLimit(rateLimit *PluginRateLimit)

func (*BasePlugin) SetRoutes added in v1.3.4

func (p *BasePlugin) SetRoutes(routes []PluginRoute)

type CSRFConfig

type CSRFConfig struct {
	Enabled    bool
	CookieName string
	HeaderName string
	ExpiresIn  time.Duration
}

type ChangeEmailConfig

type ChangeEmailConfig struct {
	Enabled                          bool
	SendEmailChangeVerificationEmail func(user User, newEmail string, url string, token string) error
}

type Config

type Config struct {
	AppName           string
	BaseURL           string
	BasePath          string
	Secret            string
	DB                *gorm.DB
	Database          DatabaseConfig
	SecondaryStorage  SecondaryStorageConfig
	EmailPassword     EmailPasswordConfig
	EmailVerification EmailVerificationConfig
	User              UserConfig
	Session           SessionConfig
	CSRF              CSRFConfig
	SocialProviders   SocialProvidersConfig
	TrustedOrigins    TrustedOriginsConfig
	RateLimit         RateLimitConfig
	EndpointHooks     EndpointHooksConfig
	DatabaseHooks     DatabaseHooksConfig
	EventHooks        EventHooksConfig
	EventBus          EventBusConfig
	Plugins           PluginsConfig
}

Config holds all configurable options for the GoBetterAuth library.

type ConfigOption

type ConfigOption func(*Config)

type CustomRoute

type CustomRoute struct {
	Method     string
	Path       string
	Middleware []CustomRouteMiddleware
	Handler    CustomRouteHandler
}

type CustomRouteHandler

type CustomRouteHandler func(config *Config) http.Handler

type CustomRouteMiddleware

type CustomRouteMiddleware func(http.Handler) http.Handler

type DatabaseConfig

type DatabaseConfig struct {
	Provider         string
	ConnectionString string
	MaxOpenConns     int
	MaxIdleConns     int
	ConnMaxLifetime  time.Duration
}

type DatabaseHooksConfig

type DatabaseHooksConfig struct {
	Users         *UserDatabaseHooksConfig
	Accounts      *AccountDatabaseHooksConfig
	Sessions      *SessionDatabaseHooksConfig
	Verifications *VerificationDatabaseHooksConfig
}

type DefaultOAuth2ProvidersConfig

type DefaultOAuth2ProvidersConfig struct {
	Google  *OAuth2Config
	GitHub  *OAuth2Config
	Discord *OAuth2Config
}

type EmailPasswordConfig

type EmailPasswordConfig struct {
	Enabled                  bool
	MinPasswordLength        int
	MaxPasswordLength        int
	DisableSignUp            bool
	RequireEmailVerification bool
	AutoSignIn               bool
	SendResetPasswordEmail   func(user User, url string, token string) error
	ResetTokenExpiry         time.Duration
	Password                 *PasswordConfig
}

type EmailVerificationConfig

type EmailVerificationConfig struct {
	SendVerificationEmail func(user User, url string, token string) error
	AutoSignIn            bool
	SendOnSignUp          bool
	SendOnSignIn          bool
	ExpiresIn             time.Duration
}

type EndpointHookContext

type EndpointHookContext struct {
	Path            string
	Method          string
	Body            map[string]any
	Headers         map[string][]string
	Query           map[string][]string
	Request         *http.Request
	User            *User
	ResponseStatus  int
	ResponseBody    []byte
	ResponseHeaders map[string][]string
	ResponseCookies []*http.Cookie
}

type EndpointHooksConfig

type EndpointHooksConfig struct {
	Before   func(ctx *EndpointHookContext) error
	Response func(ctx *EndpointHookContext) error
	After    func(ctx *EndpointHookContext) error
}

type Event

type Event struct {
	ID        string            `json:"id"`
	Type      string            `json:"type"`
	Timestamp time.Time         `json:"timestamp"`
	Payload   json.RawMessage   `json:"payload"`
	Metadata  map[string]string `json:"metadata"`
}

Event represents data to be published or received via the EventBus

type EventBus

type EventBus interface {
	EventPublisher
	EventSubscriber
}

EventBus combines publisher and subscriber functionality

type EventBusConfig

type EventBusConfig struct {
	Enabled               bool
	Prefix                string
	MaxConcurrentHandlers int
	PubSub                PubSub
}

type EventHandler

type EventHandler func(ctx context.Context, event Event) error

EventHandler processes events

type EventHooksConfig

type EventHooksConfig struct {
	OnUserSignedUp    func(user User) error
	OnUserLoggedIn    func(user User) error
	OnEmailVerified   func(user User) error
	OnPasswordChanged func(user User) error
	OnEmailChanged    func(user User) error
}

type EventPublisher

type EventPublisher interface {
	Publish(ctx context.Context, event Event) error
	Close() error
}

EventPublisher defines the interface for publishing events

type EventSubscriber

type EventSubscriber interface {
	Subscribe(eventType string, handler EventHandler) (SubscriptionID, error)
	Unsubscribe(eventType string, id SubscriptionID)
	Close() error
}

EventSubscriber defines the interface for subscribing to events

type GenericOAuth2Config

type GenericOAuth2Config struct {
	OAuth2Config
	Endpoint GenericOAuth2EndpointConfig
}

type GenericOAuth2EndpointConfig

type GenericOAuth2EndpointConfig struct {
	AuthURL     string
	TokenURL    string
	UserInfoURL string
}

type IPConfig

type IPConfig struct {
	Headers []string
}

type KeyValueStore

type KeyValueStore struct {
	Key       string     `json:"key" gorm:"primaryKey"`
	Value     string     `json:"value"`
	ExpiresAt *time.Time `json:"expires_at,omitempty"`
	CreatedAt time.Time  `json:"created_at"`
	UpdatedAt time.Time  `json:"updated_at"`
}

KeyValueStore represents the persistent key-value store table in the database. This is a domain model used for secondary storage operations.

type Message

type Message struct {
	UUID     string
	Payload  []byte // Message payload (serialized data)
	Metadata map[string]string
}

Message represents a message in the pub/sub system.

type OAuth2Config

type OAuth2Config struct {
	ClientID     string
	ClientSecret string
	RedirectURL  string
	Scopes       []string
}

type OAuth2UserInfo

type OAuth2UserInfo struct {
	ID       string
	Email    string
	Name     string
	Picture  string
	Verified bool
}

type PasswordConfig

type PasswordConfig struct {
	Hash   func(password string) (string, error)
	Verify func(hashedPassword, password string) bool
}

type Plugin

type Plugin interface {
	Metadata() PluginMetadata
	SetMetadata(meta PluginMetadata)

	Config() PluginConfig
	SetConfig(cfg PluginConfig)

	Ctx() *PluginContext
	SetCtx(ctx *PluginContext)

	Init(ctx *PluginContext) error
	SetInit(fn func(ctx *PluginContext) error)

	Migrations() []any
	SetMigrations(migrations []any)

	Routes() []PluginRoute
	SetRoutes(routes []PluginRoute)

	RateLimit() *PluginRateLimit
	SetRateLimit(rateLimit *PluginRateLimit)

	DatabaseHooks() any
	SetDatabaseHooks(hooks any)

	EventHooks() any
	SetEventHooks(hooks any)

	Close() error
	SetClose(fn func() error)
}

type PluginConfig

type PluginConfig struct {
	Enabled bool
	Options any
}

PluginConfig holds per-plugin configuration.

type PluginContext

type PluginContext struct {
	Config     *Config
	Api        *Api
	EventBus   EventBus
	Middleware *PluginMiddleware
}

type PluginMetadata

type PluginMetadata struct {
	Name        string
	Version     string
	Description string
}

type PluginMiddleware

type PluginMiddleware struct {
	Auth          func() func(http.Handler) http.Handler
	OptionalAuth  func() func(http.Handler) http.Handler
	CorsAuth      func() func(http.Handler) http.Handler
	CSRF          func() func(http.Handler) http.Handler
	RateLimit     func() func(http.Handler) http.Handler
	EndpointHooks func() func(http.Handler) http.Handler
}

type PluginOption added in v1.3.4

type PluginOption func(p Plugin)

type PluginRateLimit

type PluginRateLimit = RateLimitConfig

type PluginRoute

type PluginRoute struct {
	Method     string
	Path       string // Relative path, /auth is auto-prefixed
	Middleware []PluginRouteMiddleware
	Handler    PluginRouteHandler
}

type PluginRouteHandler

type PluginRouteHandler func() http.Handler

type PluginRouteMiddleware

type PluginRouteMiddleware func(http.Handler) http.Handler

type PluginsConfig

type PluginsConfig struct {
	Plugins []Plugin
}

type ProviderType

type ProviderType string
const (
	ProviderEmail   ProviderType = "email"
	ProviderDiscord ProviderType = "discord"
	ProviderGitHub  ProviderType = "github"
	ProviderGoogle  ProviderType = "google"
)

type PubSub

type PubSub interface {
	// Publish sends a message to the specified topic
	Publish(ctx context.Context, topic string, msg *Message) error

	// Subscribe returns a channel that receives messages from the specified topic.
	// The channel should be closed when the subscription is cancelled or closed.
	Subscribe(ctx context.Context, topic string) (<-chan *Message, error)

	// Close closes the pub/sub and cleans up resources
	Close() error
}

PubSub is a generic publish-subscribe interface.

type RateLimitConfig

type RateLimitConfig struct {
	Enabled     bool
	Window      time.Duration
	Max         int
	Algorithm   string
	Prefix      string
	CustomRules map[string]RateLimitCustomRuleFunc
	IP          IPConfig
}

type RateLimitCustomRule

type RateLimitCustomRule struct {
	Disabled bool
	Window   time.Duration
	Max      int
}

type RateLimitCustomRuleFunc

type RateLimitCustomRuleFunc func(req *http.Request) RateLimitCustomRule

type RateLimitService

type RateLimitService interface {
	Allow(ctx context.Context, key string, req *http.Request) (bool, error)
	GetClientIP(req *http.Request) string
	BuildKey(key string) string
}

type SecondaryStorage

type SecondaryStorage interface {
	Get(ctx context.Context, key string) (any, error)
	Set(ctx context.Context, key string, value any, ttl *time.Duration) error
	Delete(ctx context.Context, key string) error
	Incr(ctx context.Context, key string, ttl *time.Duration) (int, error)
}

SecondaryStorage defines an interface for secondary storage operations.

type SecondaryStorageConfig

type SecondaryStorageConfig struct {
	Type            SecondaryStorageType
	MemoryOptions   *SecondaryStorageMemoryOptions
	DatabaseOptions *SecondaryStorageDatabaseOptions
	Storage         SecondaryStorage
}

type SecondaryStorageDatabaseOptions

type SecondaryStorageDatabaseOptions struct {
	// CleanupInterval controls how often expired entries are cleaned up.
	// If zero, the implementation should use a default.
	CleanupInterval time.Duration
}

SecondaryStorageDatabaseOptions holds settings specific to the database storage.

type SecondaryStorageMemoryOptions

type SecondaryStorageMemoryOptions struct {
	// CleanupInterval controls how often expired entries are cleaned up.
	// If zero, the implementation should use a default.
	CleanupInterval time.Duration
}

SecondaryStorageMemoryOptions holds settings specific to the in-memory storage.

type SecondaryStorageType

type SecondaryStorageType string
const (
	SecondaryStorageTypeMemory   SecondaryStorageType = "memory"
	SecondaryStorageTypeDatabase SecondaryStorageType = "database"
	SecondaryStorageTypeCustom   SecondaryStorageType = "custom"
)

type Session

type Session struct {
	ID        string    `json:"id" gorm:"primaryKey"`
	UserID    string    `json:"user_id" gorm:"index"`
	Token     string    `json:"token" gorm:"uniqueIndex"`
	ExpiresAt time.Time `json:"expires_at"`
	IPAddress *string   `json:"ip_address,omitempty"`
	UserAgent *string   `json:"user_agent,omitempty"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

type SessionConfig

type SessionConfig struct {
	CookieName string
	ExpiresIn  time.Duration
	UpdateAge  time.Duration
}

type SessionDatabaseHooksConfig

type SessionDatabaseHooksConfig struct {
	BeforeCreate func(session *Session) error
	AfterCreate  func(session Session) error
}

type SessionService

type SessionService interface {
	CreateSession(userID string, token string) (*Session, error)
	GetSessionByUserID(userID string) (*Session, error)
	GetSessionByToken(token string) (*Session, error)
	DeleteSessionByID(ID string) error
}

type SocialProvidersConfig

type SocialProvidersConfig struct {
	Default DefaultOAuth2ProvidersConfig
	Generic map[string]GenericOAuth2Config
}

type SubscriptionID added in v1.3.1

type SubscriptionID uint64

SubscriptionID identifies a specific event handler subscription for removal

type TokenService

type TokenService interface {
	GenerateToken() (string, error)
	HashToken(token string) string
	GenerateEncryptedToken() (string, error)
	EncryptToken(token string) (string, error)
	DecryptToken(encryptedToken string) (string, error)
}

type TrustedOriginsConfig

type TrustedOriginsConfig struct {
	Origins []string
}

type User

type User struct {
	ID            string    `json:"id" gorm:"primaryKey"`
	Name          string    `json:"name"`
	Email         string    `json:"email" gorm:"uniqueIndex"`
	EmailVerified bool      `json:"email_verified"`
	Image         *string   `json:"image,omitempty"`
	CreatedAt     time.Time `json:"created_at"`
	UpdatedAt     time.Time `json:"updated_at"`
}

type UserConfig

type UserConfig struct {
	ChangeEmail ChangeEmailConfig
}

type UserDatabaseHooksConfig

type UserDatabaseHooksConfig struct {
	BeforeCreate func(user *User) error
	AfterCreate  func(user User) error
	BeforeUpdate func(user *User) error
	AfterUpdate  func(user User) error
}

type UserService

type UserService interface {
	CreateUser(user *User) error
	GetUserByID(id string) (*User, error)
	GetUserByEmail(email string) (*User, error)
	UpdateUser(user *User) error
}

type Verification

type Verification struct {
	ID         string           `json:"id" gorm:"primaryKey"`
	UserID     *string          `json:"user_id,omitempty"`
	Identifier string           `json:"identifier"` // email or other identifier
	Token      string           `json:"token"`
	Type       VerificationType `json:"type"`
	ExpiresAt  time.Time        `json:"expires_at"`
	CreatedAt  time.Time        `json:"created_at"`
	UpdatedAt  time.Time        `json:"updated_at"`
}

type VerificationDatabaseHooksConfig

type VerificationDatabaseHooksConfig struct {
	BeforeCreate func(verification *Verification) error
	AfterCreate  func(verification Verification) error
}

type VerificationService

type VerificationService interface {
	CreateVerification(verif *Verification) error
	GetVerificationByToken(token string) (*Verification, error)
	DeleteVerification(id string) error
	IsExpired(verif *Verification) bool
}

type VerificationType

type VerificationType string
const (
	TypeEmailVerification VerificationType = "email_verification"
	TypePasswordReset     VerificationType = "password_reset"
	TypeEmailChange       VerificationType = "email_change"
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL