Documentation
¶
Overview ¶
Package httpauth provides provider-agnostic HTTP middleware for identity enrichment and RBAC authorization.
Any upstream AuthMiddleware that calls SetTokenData to inject uid and claims into the request context is compatible with this package — Firebase, self-issued JWT, API key, etc.
Typical middleware chain:
r.Use(jwtauth.AuthMiddleware(signer, publicPaths, nil))
r.Use(httpauth.EnrichmentMiddleware(userEnricher, httpauth.WithTenantHeader("X-Tenant-ID")))
// Choose one PermissionProvider:
claimsProvider := httpauth.NewClaimsPermissionProvider("permisos") // JWT-embedded
cachedProvider := httpauth.NewCachedPermissionProvider(db, cache, ttl) // runtime + cache
r.With(httpauth.AuthzMiddleware(provider, "orders", rbac.Permission(1))).
Post("/orders", handler)
Index ¶
- func AuthzMiddleware(provider rbac.PermissionProvider, resource string, required rbac.Permission) func(http.Handler) http.Handler
- func EnrichmentMiddleware(enricher IdentityEnricher, opts ...EnrichOpt) func(http.Handler) http.Handler
- func NewCachedPermissionProvider(inner rbac.PermissionProvider, cache Cache, ttl time.Duration) rbac.PermissionProvider
- func NewChainPermissionProvider(providers ...rbac.PermissionProvider) rbac.PermissionProvider
- func NewClaimsPermissionProvider(claimsKey string) rbac.PermissionProvider
- func SetTokenData(ctx context.Context, uid string, claims map[string]any) context.Context
- type Cache
- type EnrichOpt
- type IdentityEnricher
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AuthzMiddleware ¶
func AuthzMiddleware(provider rbac.PermissionProvider, resource string, required rbac.Permission) func(http.Handler) http.Handler
AuthzMiddleware reads the rbac.Identity from context (set by EnrichmentMiddleware) and gates the request against the required permission on resource. Uses rbac.PermissionProvider directly — no local redefinition of the interface. Returns 401 if no identity is in context. Returns 403 if the identity lacks the required permission or if the provider errors.
func EnrichmentMiddleware ¶
func EnrichmentMiddleware(enricher IdentityEnricher, opts ...EnrichOpt) func(http.Handler) http.Handler
EnrichmentMiddleware reads uid + claims injected by any upstream AuthMiddleware via SetTokenData, calls enricher.Enrich, and stores the resulting rbac.Identity in context via rbac.SetInContext. Returns 401 if no uid is present (SetTokenData was not called upstream). Returns 500 if the enricher fails.
func NewCachedPermissionProvider ¶
func NewCachedPermissionProvider(inner rbac.PermissionProvider, cache Cache, ttl time.Duration) rbac.PermissionProvider
NewCachedPermissionProvider wraps inner with a TTL-based cache layer. Cache key format: "rbac:{uid}:{resource}". On cache miss, falls through to inner and populates the cache. On cache error, falls through to inner silently — never fails due to cache unavailability. For explicit invalidation, delete "rbac:{uid}:{resource}" directly via your Cache.
func NewChainPermissionProvider ¶ added in v1.0.0
func NewChainPermissionProvider(providers ...rbac.PermissionProvider) rbac.PermissionProvider
NewChainPermissionProvider returns an rbac.PermissionProvider that tries each provider in order and returns the first non-zero mask. If all providers return 0, the result is 0. On error from any provider, the error is propagated immediately and subsequent providers are not consulted.
Primary use case: JWT claims fast-path with DB fallback.
chain := httpauth.NewChainPermissionProvider(
httpauth.NewClaimsPermissionProvider("permisos"), // JWT claims — no DB call
httpauth.NewCachedPermissionProvider(dbProvider, cache, 5*time.Minute), // fallback
)
func NewClaimsPermissionProvider ¶
func NewClaimsPermissionProvider(claimsKey string) rbac.PermissionProvider
NewClaimsPermissionProvider returns an rbac.PermissionProvider that reads pre-computed permission masks from JWT claims stored in the request context by SetTokenData. Expects claims[claimsKey] to be a map[string]any where each key is a resource name and the value is the bitmask as int64 or float64 (JSON unmarshaling decodes numbers as float64). Returns 0 without error if the claim is absent — callers treat 0 as no access.
func SetTokenData ¶
SetTokenData injects a verified uid and raw claims into the context. Called by provider-specific AuthMiddleware implementations after token verification. EnrichmentMiddleware reads these values automatically via unexported helpers.
Types ¶
type Cache ¶
type Cache interface {
Get(ctx context.Context, key string) (int64, bool, error)
Set(ctx context.Context, key string, value int64, ttl time.Duration) error
}
Cache abstracts the caching backend for permission masks. Implementations are typically backed by Valkey or Redis.
type EnrichOpt ¶
type EnrichOpt func(*enrichConfig)
EnrichOpt configures EnrichmentMiddleware.
func WithTenantHeader ¶
WithTenantHeader configures the request header from which TenantID is read. If the header is absent on a request, TenantID remains "" — no error is returned.