Documentation
¶
Index ¶
- Constants
- Variables
- func AuthenticationJWTHandler(c echo.Context) error
- func BuildUserStubFromClaims(claims *AccessClaims) *user_models.UserModel
- func GenerateAccessToken(cfg *Config, u bolo.UserInterface) (accessToken string, expiresIn int64, err error)
- func InitConfig(app bolo.App)
- func LooksLikeJWT(token string) bool
- func RefreshTokenJWTHandler(c echo.Context) error
- type AccessClaims
- type Config
- type Oauth2JWTPlugin
- type PluginCfgs
Constants ¶
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.
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 ¶
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 ¶
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 ¶
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 ¶
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 ¶
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_*).
type Oauth2JWTPlugin ¶
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
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).