Documentation
¶
Index ¶
- Variables
- func HashPassword(password string) (string, error)
- func NewCSRFToken(secret []byte) (string, error)
- func NormalizeEmail(email string) string
- func RegisterRoutes(mux *http.ServeMux, service *Service)
- func RequireAuthentication(service *Service, next http.Handler) http.Handler
- func RequirePermission(service *Service, permission string, next http.Handler) http.Handler
- func RequireRole(service *Service, role string, next http.Handler) http.Handler
- func ValidateCSRFToken(secret []byte, token string) bool
- func ValidatePassword(password string) error
- func VerifyPassword(encoded, password string) bool
- type AuthResponse
- type AuthResult
- type CSRFResponse
- type Controller
- func (c *Controller) HandleCSRF(w http.ResponseWriter, r *http.Request)
- func (c *Controller) HandleLogin(w http.ResponseWriter, r *http.Request)
- func (c *Controller) HandleLogout(w http.ResponseWriter, r *http.Request)
- func (c *Controller) HandleMe(w http.ResponseWriter, r *http.Request)
- func (c *Controller) HandleRefresh(w http.ResponseWriter, r *http.Request)
- type LoginRequest
- type PostgresRepository
- func (r *PostgresRepository) ClearLoginAttempts(ctx context.Context, key string) error
- func (r *PostgresRepository) CreateAdmin(ctx context.Context, email, passwordHash string) (User, error)
- func (r *PostgresRepository) CreateRefreshToken(ctx context.Context, token refreshToken) error
- func (r *PostgresRepository) FindUserByEmail(ctx context.Context, email string) (storedUser, error)
- func (r *PostgresRepository) IsLoginRateLimited(ctx context.Context, key string, now time.Time) (bool, error)
- func (r *PostgresRepository) RecordLoginFailure(ctx context.Context, key string, now time.Time) (bool, error)
- func (r *PostgresRepository) RevokeRefreshFamilyByToken(ctx context.Context, hash []byte, now time.Time) error
- func (r *PostgresRepository) RotateRefreshToken(ctx context.Context, hash []byte, replacement refreshToken, now time.Time) (storedUser, error)
- type Principal
- type Repository
- type Service
- func (s *Service) Authenticate(rawToken string, now time.Time) (Principal, error)
- func (s *Service) Available() bool
- func (s *Service) CreateAdmin(ctx context.Context, email, password string) (User, error)
- func (s *Service) Login(ctx context.Context, request LoginRequest, remoteAddr string, now time.Time) (AuthResult, error)
- func (s *Service) Logout(ctx context.Context, rawToken string, now time.Time) error
- func (s *Service) NewCSRFToken() (string, error)
- func (s *Service) Refresh(ctx context.Context, rawToken string, now time.Time) (AuthResult, error)
- func (s *Service) ValidateCSRFToken(token string) bool
- type TokenManager
- type User
Constants ¶
This section is empty.
Variables ¶
View Source
var ( ErrInvalidCredentials = errors.New("invalid credentials") ErrRateLimited = errors.New("login rate limited") ErrInvalidRefreshToken = errors.New("invalid refresh token") ErrRefreshReuse = errors.New("refresh token reuse detected") ErrInvalidCSRF = errors.New("invalid csrf token") ErrUnauthenticated = errors.New("authentication required") ErrForbidden = errors.New("permission denied") ErrUserExists = errors.New("user already exists") )
Functions ¶
func HashPassword ¶
func NewCSRFToken ¶
func NormalizeEmail ¶
func RegisterRoutes ¶
func RequireAuthentication ¶
func RequirePermission ¶
func RequireRole ¶ added in v0.4.0
RequireRole enforces an explicit role after authenticating the request. Roles do not grant access implicitly; product routes should normally pair this check with RequirePermission when both dimensions are part of the authorization contract.
func ValidateCSRFToken ¶
func ValidatePassword ¶
func VerifyPassword ¶
Types ¶
type AuthResponse ¶
type AuthResponse struct {
User User `json:"user"`
}
type AuthResult ¶
type CSRFResponse ¶
type CSRFResponse struct {
CSRFToken string `json:"csrf_token"`
}
type Controller ¶
type Controller struct {
// contains filtered or unexported fields
}
func NewController ¶
func NewController(service *Service) *Controller
func (*Controller) HandleCSRF ¶
func (c *Controller) HandleCSRF(w http.ResponseWriter, r *http.Request)
func (*Controller) HandleLogin ¶
func (c *Controller) HandleLogin(w http.ResponseWriter, r *http.Request)
func (*Controller) HandleLogout ¶
func (c *Controller) HandleLogout(w http.ResponseWriter, r *http.Request)
func (*Controller) HandleMe ¶
func (c *Controller) HandleMe(w http.ResponseWriter, r *http.Request)
func (*Controller) HandleRefresh ¶
func (c *Controller) HandleRefresh(w http.ResponseWriter, r *http.Request)
type LoginRequest ¶
type PostgresRepository ¶
type PostgresRepository struct {
// contains filtered or unexported fields
}
func NewPostgresRepository ¶
func NewPostgresRepository(pool *pgxpool.Pool) *PostgresRepository
func (*PostgresRepository) ClearLoginAttempts ¶
func (r *PostgresRepository) ClearLoginAttempts(ctx context.Context, key string) error
func (*PostgresRepository) CreateAdmin ¶
func (*PostgresRepository) CreateRefreshToken ¶
func (r *PostgresRepository) CreateRefreshToken(ctx context.Context, token refreshToken) error
func (*PostgresRepository) FindUserByEmail ¶
func (r *PostgresRepository) FindUserByEmail(ctx context.Context, email string) (storedUser, error)
func (*PostgresRepository) IsLoginRateLimited ¶
func (*PostgresRepository) RecordLoginFailure ¶
func (*PostgresRepository) RevokeRefreshFamilyByToken ¶
func (*PostgresRepository) RotateRefreshToken ¶
type Repository ¶
type Repository interface {
FindUserByEmail(context.Context, string) (storedUser, error)
CreateAdmin(context.Context, string, string) (User, error)
IsLoginRateLimited(context.Context, string, time.Time) (bool, error)
RecordLoginFailure(context.Context, string, time.Time) (bool, error)
ClearLoginAttempts(context.Context, string) error
CreateRefreshToken(context.Context, refreshToken) error
RotateRefreshToken(context.Context, []byte, refreshToken, time.Time) (storedUser, error)
RevokeRefreshFamilyByToken(context.Context, []byte, time.Time) error
}
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
func NewProvisioner ¶
func NewProvisioner(repository Repository) *Service
func NewService ¶
func NewService(repository Repository, tokens *TokenManager, csrfSecret string, accessTokenTTL, refreshTokenTTL time.Duration, cookieSecure bool, cookieSameSite http.SameSite) *Service
func (*Service) Authenticate ¶
func (*Service) CreateAdmin ¶
func (*Service) Login ¶
func (s *Service) Login(ctx context.Context, request LoginRequest, remoteAddr string, now time.Time) (AuthResult, error)
func (*Service) NewCSRFToken ¶
func (*Service) ValidateCSRFToken ¶
type TokenManager ¶
type TokenManager struct {
// contains filtered or unexported fields
}
func LoadTokenManager ¶
func LoadTokenManager(privatePath, publicPath, keyID, issuer, audience string) (*TokenManager, error)
func (*TokenManager) IssueAccessToken ¶
func (*TokenManager) ParseAccessToken ¶
Click to show internal directories.
Click to hide internal directories.