46 lines
1.5 KiB
Go
46 lines
1.5 KiB
Go
// Package middleware provides HTTP middleware components for the Veylant proxy.
|
|
package middleware
|
|
|
|
import "context"
|
|
|
|
// contextKey is an unexported type for context keys in this package.
|
|
type contextKey string
|
|
|
|
const (
|
|
claimsKey contextKey = "veylant.claims"
|
|
requestIDKey contextKey = "veylant.request_id"
|
|
)
|
|
|
|
// UserClaims holds the authenticated user information extracted from a JWT.
|
|
type UserClaims struct {
|
|
UserID string // JWT "sub" claim (Keycloak UUID).
|
|
TenantID string // Custom "tenant_id" claim added via Keycloak protocol mapper.
|
|
Email string // JWT "email" claim.
|
|
Roles []string // realm_access.roles from the JWT.
|
|
Department string // JWT "department" claim (optional, used for routing).
|
|
}
|
|
|
|
// WithClaims returns a new context carrying c.
|
|
func WithClaims(ctx context.Context, c *UserClaims) context.Context {
|
|
return context.WithValue(ctx, claimsKey, c)
|
|
}
|
|
|
|
// ClaimsFromContext retrieves UserClaims from ctx.
|
|
// The second return value is false if no claims are present.
|
|
func ClaimsFromContext(ctx context.Context) (*UserClaims, bool) {
|
|
c, ok := ctx.Value(claimsKey).(*UserClaims)
|
|
return c, ok
|
|
}
|
|
|
|
// withRequestID returns a new context carrying id.
|
|
func withRequestID(ctx context.Context, id string) context.Context {
|
|
return context.WithValue(ctx, requestIDKey, id)
|
|
}
|
|
|
|
// RequestIDFromContext retrieves the request ID string from ctx.
|
|
// Returns an empty string if not set.
|
|
func RequestIDFromContext(ctx context.Context) string {
|
|
id, _ := ctx.Value(requestIDKey).(string)
|
|
return id
|
|
}
|