slack-auth-1770277167/pkg/auth/auth.go
jordan 6bdb5642ca
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
Initialize project from skeleton template
2026-02-05 07:39:28 +00:00

92 lines
2.3 KiB
Go

// Package auth provides authentication utilities for HTTP services.
//
// This package supports multiple authentication methods:
// - API Key authentication (X-API-Key header)
// - JWT Bearer token authentication
//
// Usage:
//
// // Create a validator
// validator := auth.NewJWTValidator(auth.JWTConfig{
// Secret: []byte("your-secret"),
// })
//
// // Use as middleware
// r.Use(auth.Middleware(validator))
//
// // Access user in handler
// user := auth.GetUser(r.Context())
package auth
import (
"context"
)
// User represents an authenticated user/principal.
type User struct {
// ID is the unique identifier for the user
ID string `json:"id"`
// Email is the user's email address (optional)
Email string `json:"email,omitempty"`
// Roles are the user's assigned roles
Roles []string `json:"roles,omitempty"`
// Scopes are the permitted scopes/permissions
Scopes []string `json:"scopes,omitempty"`
// Metadata contains additional user data
Metadata map[string]any `json:"metadata,omitempty"`
}
// HasRole checks if the user has a specific role.
func (u *User) HasRole(role string) bool {
for _, r := range u.Roles {
if r == role {
return true
}
}
return false
}
// HasAnyRole checks if the user has any of the specified roles.
func (u *User) HasAnyRole(roles ...string) bool {
for _, role := range roles {
if u.HasRole(role) {
return true
}
}
return false
}
// HasScope checks if the user has a specific scope.
func (u *User) HasScope(scope string) bool {
for _, s := range u.Scopes {
if s == scope {
return true
}
}
return false
}
// HasAnyScope checks if the user has any of the specified scopes.
func (u *User) HasAnyScope(scopes ...string) bool {
for _, scope := range scopes {
if u.HasScope(scope) {
return true
}
}
return false
}
// Validator validates authentication credentials and returns a User.
type Validator interface {
// Validate validates the provided token/key and returns a User.
// Returns an error if validation fails.
Validate(ctx context.Context, token string) (*User, error)
}
// TokenExtractor extracts an authentication token from a request.
type TokenExtractor interface {
// Extract extracts a token from the context (usually the request).
// Returns empty string if no token is found.
Extract(ctx context.Context) string
}