Autenticação e autorização
Rotas com prefixo restserver.AuthenticatedApi exigem um AuthenticationContext válido.
Comportamento padrão
O middleware padrão lê:
| Header | Campo |
|---|---|
X-Tenant-Id | TenantID |
X-User-Id | UserID |
Os dois valores precisam estar preenchidos. Caso contrário, a rota responde 401.
auth := ctx.AuthenticationContext()
if auth == nil || !auth.Valid() {
ctx.ErrorResponse(http.StatusUnauthorized, errors.New("unauthenticated"))
return
}
O mesmo valor está disponível no contexto Go:
auth := security.GetAuthenticationContext(ctx.Context())
tenantID := auth.GetTenantID()
userID := auth.GetUserID()
Criar e propagar contexto
Fora de um handler:
auth := security.NewAuthenticationContext("tenant-123", "user-456")
ctx = auth.SetInContext(ctx)
Propague o contexto para banco, mensageria e clientes.
Autenticação personalizada
Implemente a validação de token ou sessão:
type bearerAuthentication struct{}
func (bearerAuthentication) Apply(
ctx restserver.WebContext,
) (*security.AuthenticationContext, error) {
token := first(ctx.RequestHeader("Authorization"))
claims, err := validateToken(token)
if err != nil {
return nil, err
}
return security.NewAuthenticationContext(
claims.TenantID,
claims.UserID,
), nil
}
Registre antes de iniciar o servidor:
restserver.CustomAuthMiddleware(bearerAuthentication{})
Autorização
O SDK fornece o contexto de identidade, mas regras de perfil e permissão pertencem à aplicação. Valide a autorização antes de executar uma operação sensível e filtre dados por TenantID em aplicações multi-tenant.
Os headers padrão são adequados apenas quando uma camada confiável anterior autentica a requisição e remove headers fornecidos pelo cliente. Em uma API exposta diretamente, use autenticação personalizada.