user_oauth2_jwt

package
v0.9.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 11, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DefaultJWTAudience = "mm"
	DefaultJWTTTL      = 10 * time.Minute
	DefaultJWTLeeway   = 30 * time.Second
)

Defaults do access JWT (valem quando a env correspondente não está presente). O secret NÃO tem default: InitConfig aplica fail-fast.

View Source
const KeyID = "1"

KeyID identifica a chave de assinatura atual no header kid (RFC 8725 §3.5): desde o v1 todo token emitido carrega o kid da chave única HS256; rotação futura de chaves adiciona entradas novas aqui.

Variables

View Source
var ErrTokenExpired = fmt.Errorf("token expirado")

ErrTokenExpired sinaliza expiração (exp) para o middleware distinguir a descrição do WWW-Authenticate ("token expired" vs "invalid token").

Functions

func AuthenticationJWTHandler

func AuthenticationJWTHandler(c echo.Context) error

AuthenticationJWTHandler emite o par no formato JWT: access stateless + refresh opaco rotativo. Mesmo contrato de corpo/resposta do grant-password (incluindo as mensagens de inativo/bloqueado) — o frontend troca de endpoint sem nenhuma outra mudança.

func BuildUserStubFromClaims

func BuildUserStubFromClaims(claims *AccessClaims) *user_models.UserModel

BuildUserStubFromClaims monta o stub de usuário a partir dos claims: RolesText alimentado com as roles do claim faz GetRoles/ctx.Can funcionarem, e o snapshot active/blocked sustenta o requireActiveUserMiddleware sem query no banco. A defasagem em relação ao banco é de no máximo o TTL do access token (contrato aceito).

func GenerateAccessToken

func GenerateAccessToken(cfg *Config, u bolo.UserInterface) (accessToken string, expiresIn int64, err error)

GenerateAccessToken emite o access JWT HS256: claims iss/aud/sub/jti/iat/ nbf/exp + roles + snapshot active/blocked, header kid fixo. Devolve o TTL em segundos (expires_in) para o contrato oauth2 da resposta.

func InitConfig

func InitConfig(app bolo.App)

InitConfig lê as envs OAUTH2_JWT_* no evento configuration e registra o gerador de access tokens JWT no oauth2_password. Fail-fast quando o subplugin está instalado sem secret: um secret vazio/implícito aceitaria tokens forjados (anti-padrão do default hardcoded, não repetido aqui).

func LooksLikeJWT

func LooksLikeJWT(token string) bool

LooksLikeJWT discrimina o formato sem parsear: um JWS compacto tem exatamente dois pontos e três segmentos não vazios. Tokens opacos do fluxo legado (uuid + random) não contêm pontos.

func RefreshTokenJWTHandler

func RefreshTokenJWTHandler(c echo.Context) error

RefreshTokenJWTHandler troca um refresh token válido por um par novo no formato JWT (access stateless). Toda a semântica de segurança (rotação single-use, graça de reuso idempotente, teto absoluto por família e revogação em cadeia quando detecta reuso) vive na lib (RotateRefreshTokenWithFormat); aqui apenas mapeamos o resultado para o contrato HTTP de sempre (status e mensagens preservados — os frontends dependem deles).

Types

type AccessClaims

type AccessClaims struct {
	Roles   []string `json:"roles,omitempty"`
	Active  bool     `json:"active"`
	Blocked bool     `json:"blocked"`
	jwt.RegisteredClaims
}

AccessClaims é o payload do access token JWT: SEM PII. As roles e o snapshot active/blocked permitem ao middleware montar o stub de usuário sem consultar o banco — a defasagem em relação ao banco (bloqueio, desativação, troca de roles) vale por no máximo o TTL do token, contrato aceito no desenho (TTL curto + checagem de verdade no gate do refresh).

func ValidateAccessToken

func ValidateAccessToken(cfg *Config, tokenString string) (*AccessClaims, error)

ValidateAccessToken valida criptográfica e semanticamente o access JWT: assinatura HS256 com o secret configurado, kid conhecido, iss/aud exatamente iguais aos configurados, sub (userID) e jti presentes, e exp/nbf/iat dentro do leeway. Fail-closed: claim ausente rejeita.

type Config

type Config struct {
	Secret   string
	Issuer   string
	Audience string
	TTL      time.Duration
	Leeway   time.Duration
}

Config carrega a configuração do access token JWT (envs OAUTH2_JWT_*).

func GetConfig

func GetConfig() *Config

GetConfig devolve a configuração ativa (nil antes do evento configuration — nesse estado o middleware devolve 401, fail-closed).

type Oauth2JWTPlugin

type Oauth2JWTPlugin struct {
	bolo.Pluginer

	Name string
}

Oauth2JWTPlugin é o subplugin de auth com access JWT stateless: emite e valida access tokens JWT (HS256) nos endpoints /auth/jwt/*, mantendo o refresh opaco rotativo do oauth2_password. Ativação/desativação = instalar/desinstalar o subplugin no consumidor (desinstalar é o kill-switch: rotas /auth/jwt somem e JWTs deixam de validar).

func NewPlugin

func NewPlugin(cfg *PluginCfgs) *Oauth2JWTPlugin

func (*Oauth2JWTPlugin) BindRoutes

func (r *Oauth2JWTPlugin) BindRoutes(app bolo.App) error

func (*Oauth2JWTPlugin) GetMigrations

func (r *Oauth2JWTPlugin) GetMigrations() []*bolo.Migration

func (*Oauth2JWTPlugin) GetName

func (p *Oauth2JWTPlugin) GetName() string

func (*Oauth2JWTPlugin) Init

func (p *Oauth2JWTPlugin) Init(app bolo.App) error

type PluginCfgs

type PluginCfgs struct {
	// OnLoginActivity é chamado após authenticate e refresh bem-sucedidos
	// (paridade com os handlers do consumidor; o mm registra atividade de
	// login). Falhas do hook são apenas logadas.
	OnLoginActivity func(userID uint64) error
}

PluginCfgs configura o subplugin. Revogação (RFC 7009) e logout continuam nos endpoints existentes (/auth/grant-password/revoke e /auth/logout).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL