Introdução ao OAuth 2.0 e JWT em C#
\nAs aplicações web modernas exigem mecanismos de segurança robustos. Dois protocolos-chave — OAuth 2.0 e JWT (JSON Web Token) — tornaram-se o padrão de facto para implementar autorização e autenticação. Neste artigo, vamos explorar como usar essas tecnologias no ecossistema C# (.NET).
\nOAuth 2.0 é um protocolo de acesso delegado que permite que aplicações obtenham acesso limitado aos recursos do usuário sem transmitir suas credenciais. JWT, por sua vez, é um formato de token compacto e autossuficiente, frequentemente usado para transmitir informações de autenticação entre o cliente e o servidor.
\nNeste guia, criaremos uma API web simples em ASP.NET Core, implementando OAuth 2.0 com tokens JWT. Você aprenderá como configurar a geração, validação e proteção de endpoints.
\n\nO que são OAuth 2.0 e JWT?
\nAntes de ir para o código, vamos entender os conceitos principais.
\nOAuth 2.0
\nOAuth 2.0 define quatro papéis:
\n- \n
- Resource Owner (proprietário do recurso) — geralmente o usuário. \n
- Client (cliente) — a aplicação que deseja obter acesso. \n
- Authorization Server (servidor de autorização) — emite os tokens. \n
- Resource Server (servidor de recursos) — fornece os dados protegidos. \n
O fluxo principal Authorization Code Grant inclui: redirecionar o usuário para o servidor de autorização, obter um código, trocar o código por um token de acesso.
\n\nJWT (JSON Web Token)
\nJWT consiste em três partes separadas por pontos:
\n- \n
- Header — tipo do token e algoritmo de assinatura (ex.: HS256). \n
- Payload — dados (claims), como ID do usuário, função, prazo de validade. \n
- Signature — assinatura criada com uma chave secreta. \n
Exemplo de JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Configuração do projeto ASP.NET Core
\nVamos criar um novo projeto de API web com suporte a autenticação.
\ndotnet new webapi -n OAuthJwtDemo\ncd OAuthJwtDemo\nAdicione os pacotes NuGet necessários:
\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\ndotnet add package System.IdentityModel.Tokens.Jwt\n\nConfiguração no appsettings.json
\nAdicione uma seção para as configurações JWT no arquivo appsettings.json:
{\n "JwtSettings": {\n "SecretKey": "YOUR_SUPER_SECRET_KEY_AT_LEAST_32_CHARS",\n "Issuer": "OAuthJwtDemo",\n "Audience": "OAuthJwtDemoClient",\n "ExpirationMinutes": 60\n }\n}\nImportante: Em um projeto real, armazene a chave secreta em User Secrets ou Azure Key Vault.
\n\nImplementação do serviço de geração JWT
\nVamos criar uma interface e sua implementação para trabalhar com tokens.
\nInterface IJwtService
\npublic interface IJwtService\n{\n string GenerateToken(string userId, string role);\n ClaimsPrincipal ValidateToken(string token);\n}\n\nImplementação JwtService
\npublic class JwtService : IJwtService\n{\n private readonly JwtSettings _settings;\n\n public JwtService(IOptions<JwtSettings> settings)\n {\n _settings = settings.Value;\n }\n\n public string GenerateToken(string userId, string role)\n {\n var claims = new[]\n {\n new Claim(ClaimTypes.NameIdentifier, userId),\n new Claim(ClaimTypes.Role, role),\n new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n };\n\n var key = new Symmetric