JWT e autenticação
ResumoJWT (JSON Web Token) é um token assinado que carrega claims do usuário. Configuramos a autenticação Bearer, geramos o token no login e protegemos endpoints com
[Authorize].
1. Objetivos de Aprendizagem#
- Explicar a estrutura e o fluxo de um JWT.
- Configurar autenticação JWT Bearer.
- Emitir o token no login e proteger endpoints.
2. Pré-requisitos#
- Identity configurado (tópico 40.1).
3. Conceito#
O diagrama abaixo resume o fluxo principal.
Um JWT tem três partes: header, payload (claims) e assinatura. O servidor assina com uma chave secreta; ao receber o token, valida a assinatura sem consultar o banco (stateless). O porquê: escalabilidade — qualquer instância valida o token localmente.
Fluxo: o cliente faz login → recebe o JWT → envia Authorization: Bearer <token> nas próximas requisições.
4. Mão na Massa#
4.1. Setup#
dotnet add Catalog.Api package Microsoft.AspNetCore.Authentication.JwtBearer
Configuração em appsettings.json (a chave secreta vem de user-secrets/variável de ambiente, não daqui):
{
"JwtSettings": {
"Issuer": "CatalogApi",
"Audience": "CatalogClients",
"ExpiresInMinutes": 15
}
}
4.2. Implementação Passo a Passo#
- Configurar a autenticação:
var jwt = builder.Configuration.GetSection("JwtSettings");
var secret = builder.Configuration["JWT_SECRET"]!; // do ambiente/secret store
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwt["Issuer"],
ValidAudience = jwt["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(secret))
};
});
- Pipeline — ordem importa:
app.UseAuthentication();
app.UseAuthorization();
- Gerar o token após validar credenciais:
public string CreateToken(ApplicationUser user, IList<string> roles)
{
var claims = new List<Claim>
{
new(ClaimTypes.Name, user.UserName!),
new(ClaimTypes.NameIdentifier, user.Id)
};
claims.AddRange(roles.Select(r => new Claim(ClaimTypes.Role, r)));
var creds = new SigningCredentials(
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret)),
SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _issuer, audience: _audience,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
4.3. Executando#
# login retorna { "token": "..." }
curl -X POST http://localhost:5000/api/authentication/login \
-H "Content-Type: application/json" -d '{"userName":"ana","password":"Senha@Forte1"}'
curl http://localhost:5000/api/produtos -H "Authorization: Bearer <token>"
5. Exemplo Completo#
Proteger endpoints:
[Authorize]
[HttpGet]
public IActionResult Get() => Ok();
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Guardar o segredo fora do código (env/secret store) | Comitar a chave no appsettings.json |
| Tokens de vida curta + refresh token | JWT com expiração de dias |
| Validar issuer, audience, lifetime e assinatura | Desligar validações "para funcionar" |
Atençãoo payload do JWT é apenas codificado em Base64, não criptografado — qualquer um lê seu conteúdo. Nunca coloque dados sensíveis (senha, PII) nas claims.
7. Segurança e Produção#
- Sempre HTTPS: um Bearer token interceptado é uma sessão sequestrada.
- Chave secreta forte (256+ bits) e rotacionável; considere chaves assimétricas (RS256) em cenários multi-serviço.
- Expiração curta reduz a janela de um token vazado (ver Módulo 41, refresh token).
8. Exercícios#
- Fácil: proteja um controller com
[Authorize]. - Médio: mova o segredo para user-secrets e leia via
IConfiguration. - Desafio: troque HS256 por RS256 com par de chaves e ajuste a validação.
9. Resumo#
Configuramos autenticação JWT Bearer, emitindo tokens assinados de vida curta e protegendo endpoints com [Authorize]. Segredo fora do código, HTTPS e validações completas são obrigatórios.
10. Próximos Passos#
A seguir, autorização baseada em roles.
11. Referências#
- Microsoft Learn — Autenticação JWT no ASP.NET Core
- Microsoft Learn — Visão geral de autenticação
- RFC 7519 — JSON Web Token