Documentation
¶
Index ¶
- Constants
- Variables
- func ClearCookie(c forge.Context, config *CookieConfig) error
- func InvalidToken() *errs.AuthsomeError
- func MaxSessionsReached(limit int) *errs.AuthsomeError
- func MissingAppContext() *errs.AuthsomeError
- func ParseSameSite(s string) http.SameSite
- func SessionCreationFailed(err error) *errs.AuthsomeError
- func SessionExpired() *errs.AuthsomeError
- func SessionNotFound() *errs.AuthsomeError
- func SessionRevocationFailed(err error) *errs.AuthsomeError
- func SetCookie(c forge.Context, token string, expiresAt time.Time, config *CookieConfig) error
- type Config
- type CookieConfig
- type CreateSessionRequest
- type HookExecutor
- type ListSessionsFilter
- type ListSessionsResponse
- type RefreshResponse
- type Repository
- type Service
- func (s *Service) Create(ctx context.Context, req *CreateSessionRequest) (*Session, error)
- func (s *Service) FindByID(ctx context.Context, id xid.ID) (*Session, error)
- func (s *Service) FindByToken(ctx context.Context, token string) (*Session, error)
- func (s *Service) ListSessions(ctx context.Context, filter *ListSessionsFilter) (*ListSessionsResponse, error)
- func (s *Service) RefreshSession(ctx context.Context, refreshToken string) (*RefreshResponse, error)
- func (s *Service) Revoke(ctx context.Context, token string) error
- func (s *Service) RevokeByID(ctx context.Context, id xid.ID) error
- func (s *Service) TouchSession(ctx context.Context, sess *Session) (*Session, bool, error)
- type ServiceInterface
- type Session
Constants ¶
const ( CodeSessionNotFound = "SESSION_NOT_FOUND" CodeSessionExpired = "SESSION_EXPIRED" CodeSessionCreationFailed = "SESSION_CREATION_FAILED" CodeSessionRevocationFailed = "SESSION_REVOCATION_FAILED" CodeInvalidToken = "INVALID_TOKEN" CodeMaxSessionsReached = "MAX_SESSIONS_REACHED" CodeMissingAppContext = "MISSING_APP_CONTEXT" )
Variables ¶
var ( ErrSessionNotFound = &errs.AuthsomeError{Code: CodeSessionNotFound} ErrSessionExpired = &errs.AuthsomeError{Code: CodeSessionExpired} ErrSessionCreationFailed = &errs.AuthsomeError{Code: CodeSessionCreationFailed} ErrSessionRevocationFailed = &errs.AuthsomeError{Code: CodeSessionRevocationFailed} ErrInvalidToken = &errs.AuthsomeError{Code: CodeInvalidToken} ErrMaxSessionsReached = &errs.AuthsomeError{Code: CodeMaxSessionsReached} ErrMissingAppContext = &errs.AuthsomeError{Code: CodeMissingAppContext} )
Functions ¶
func ClearCookie ¶ added in v0.0.3
func ClearCookie(c forge.Context, config *CookieConfig) error
ClearCookie clears a session cookie by setting it to expire immediately.
func InvalidToken ¶
func InvalidToken() *errs.AuthsomeError
func MaxSessionsReached ¶
func MaxSessionsReached(limit int) *errs.AuthsomeError
func MissingAppContext ¶
func MissingAppContext() *errs.AuthsomeError
func ParseSameSite ¶ added in v0.0.2
ParseSameSite converts a string to http.SameSite constant Returns Lax as default for invalid values.
func SessionCreationFailed ¶
func SessionCreationFailed(err error) *errs.AuthsomeError
func SessionExpired ¶
func SessionExpired() *errs.AuthsomeError
func SessionNotFound ¶
func SessionNotFound() *errs.AuthsomeError
func SessionRevocationFailed ¶
func SessionRevocationFailed(err error) *errs.AuthsomeError
Types ¶
type Config ¶
type Config struct {
// Basic TTL settings
DefaultTTL time.Duration
RememberTTL time.Duration
AllowMultiple bool
RequireUserAuth bool
// Sliding session renewal (Option 1)
EnableSlidingWindow bool // Enable automatic session renewal
SlidingRenewalAfter time.Duration // Only renew if session age > this (default: 5 min)
// Refresh token support (Option 3)
EnableRefreshTokens bool // Enable refresh token pattern
RefreshTokenTTL time.Duration // Refresh token lifetime (default: 30 days)
AccessTokenTTL time.Duration // Short-lived access token (default: 15 min)
}
Config represents session service configuration.
type CookieConfig ¶ added in v0.0.2
type CookieConfig struct {
Enabled bool `json:"enabled"` // Enable/disable cookie setting
Name string `json:"name"` // Cookie name (default: "authsome_session")
Domain string `json:"domain,omitempty"` // Cookie domain
Path string `json:"path"` // Cookie path (default: "/")
Secure *bool `json:"secure,omitempty"` // Secure flag (nil = auto-detect based on TLS)
HttpOnly bool `json:"httpOnly"` // HttpOnly flag (default: true)
SameSite string `json:"sameSite,omitempty"` // SameSite: "Strict", "Lax", "None" (default: "Lax")
MaxAge *int `json:"maxAge,omitempty"` // MaxAge in seconds (nil = use session duration)
}
CookieConfig represents the configuration for session cookies.
func DefaultCookieConfig ¶ added in v0.0.2
func DefaultCookieConfig() CookieConfig
DefaultCookieConfig returns a cookie configuration with sensible defaults.
func UnmarshalCookieConfigFromJSON ¶ added in v0.0.2
func UnmarshalCookieConfigFromJSON(data []byte) (*CookieConfig, error)
UnmarshalCookieConfigFromJSON unmarshals cookie config from JSON bytes This is a helper for extracting cookie config from app metadata.
func (*CookieConfig) Merge ¶ added in v0.0.2
func (c *CookieConfig) Merge(override *CookieConfig) *CookieConfig
Merge applies per-app overrides to the base config and returns a new merged config The override config takes precedence over the base config for non-zero values Special handling for boolean fields: - Enabled: Only override if override.Enabled is true (can't distinguish false from unset) - HttpOnly: Only override if override.HttpOnly is false (since default is true).
type CreateSessionRequest ¶
type CreateSessionRequest struct {
AppID xid.ID `json:"appID"`
EnvironmentID *xid.ID `json:"environmentID,omitempty"`
OrganizationID *xid.ID `json:"organizationID,omitempty"`
UserID xid.ID `json:"userId"`
IPAddress string `json:"ipAddress"`
UserAgent string `json:"userAgent"`
Remember bool `json:"remember"`
}
CreateSessionRequest represents the data to create a session.
type HookExecutor ¶ added in v0.0.3
type HookExecutor interface {
ExecuteBeforeSessionCreate(ctx context.Context, req *CreateSessionRequest) error
ExecuteAfterSessionCreate(ctx context.Context, session *Session) error
ExecuteBeforeSessionRevoke(ctx context.Context, token string) error
ExecuteAfterSessionRevoke(ctx context.Context, sessionID xid.ID) error
}
HookExecutor defines the interface for executing session-related hooks This interface allows the session service to execute hooks without importing the hooks package, avoiding circular dependencies (hooks package imports session for types).
type ListSessionsFilter ¶
type ListSessionsFilter struct {
pagination.PaginationParams
AppID xid.ID `json:"appId" query:"app_id"`
EnvironmentID *xid.ID `json:"environmentId,omitempty" query:"environment_id"`
OrganizationID *xid.ID `json:"organizationId,omitempty" query:"organization_id"`
UserID *xid.ID `json:"userId,omitempty" query:"user_id"`
Active *bool `json:"active,omitempty" query:"active"` // Filter by expired/active
}
ListSessionsFilter represents filter parameters for listing sessions.
type ListSessionsResponse ¶
type ListSessionsResponse = pagination.PageResponse[*Session]
ListSessionsResponse is a type alias for paginated response.
type RefreshResponse ¶ added in v0.0.3
type RefreshResponse struct {
Session *Session `json:"session"` // Updated session with new access token
AccessToken string `json:"accessToken"` // New short-lived access token
RefreshToken string `json:"refreshToken"` // Refresh token (may be rotated)
ExpiresAt time.Time `json:"expiresAt"` // Access token expiry
RefreshExpiresAt time.Time `json:"refreshExpiresAt"` // Refresh token expiry
}
RefreshResponse represents the response from refreshing a session.
type Repository ¶
type Repository interface {
// Create/Read operations
CreateSession(ctx context.Context, s *schema.Session) error
FindSessionByID(ctx context.Context, id xid.ID) (*schema.Session, error)
FindSessionByToken(ctx context.Context, token string) (*schema.Session, error)
FindSessionByRefreshToken(ctx context.Context, refreshToken string) (*schema.Session, error)
// List with pagination
ListSessions(ctx context.Context, filter *ListSessionsFilter) (*pagination.PageResponse[*schema.Session], error)
// Update/Delete operations
RevokeSession(ctx context.Context, token string) error
RevokeSessionByID(ctx context.Context, id xid.ID) error
UpdateSessionExpiry(ctx context.Context, id xid.ID, expiresAt time.Time) error
RefreshSessionTokens(ctx context.Context, id xid.ID, newAccessToken string, accessTokenExpiresAt time.Time, newRefreshToken string, refreshTokenExpiresAt time.Time) error
// Count operations
CountSessions(ctx context.Context, appID xid.ID, userID *xid.ID) (int, error)
// Maintenance
CleanupExpiredSessions(ctx context.Context) (int, error)
}
Repository defines session persistence operations Following ISP - works with schema types.
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service provides session-related operations.
func NewService ¶
func NewService(repo Repository, cfg Config, webhookSvc *webhook.Service, hookExecutor HookExecutor) *Service
NewService creates a new session service.
func (*Service) FindByToken ¶
FindByToken retrieves a session by token.
func (*Service) ListSessions ¶
func (s *Service) ListSessions(ctx context.Context, filter *ListSessionsFilter) (*ListSessionsResponse, error)
ListSessions retrieves sessions with filtering and pagination.
func (*Service) RefreshSession ¶ added in v0.0.3
func (s *Service) RefreshSession(ctx context.Context, refreshToken string) (*RefreshResponse, error)
RefreshSession refreshes an access token using a refresh token (Option 3) This implements the refresh token pattern for long-lived sessions.
func (*Service) RevokeByID ¶
RevokeByID revokes a session by ID.
type ServiceInterface ¶
type ServiceInterface interface {
Create(ctx context.Context, req *CreateSessionRequest) (*Session, error)
FindByToken(ctx context.Context, token string) (*Session, error)
FindByID(ctx context.Context, id xid.ID) (*Session, error)
ListSessions(ctx context.Context, filter *ListSessionsFilter) (*ListSessionsResponse, error)
Revoke(ctx context.Context, token string) error
RevokeByID(ctx context.Context, id xid.ID) error
// Sliding session renewal (Option 1)
TouchSession(ctx context.Context, sess *Session) (*Session, bool, error)
// Refresh token pattern (Option 3)
RefreshSession(ctx context.Context, refreshToken string) (*RefreshResponse, error)
}
ServiceInterface defines the contract for session service operations This allows plugins to decorate the service with additional behavior.
type Session ¶
Session represents a user session (DTO).
func FromSchemaSession ¶
FromSchemaSession converts schema.Session to Session DTO.
func FromSchemaSessions ¶
FromSchemaSessions converts multiple schema.Session to Session DTOs.