Introdução ao OAuth 2.0 e autorização JWT em JavaScript
Aplicações web modernas exigem um sistema robusto de autenticação e autorização. Dois dos padrões mais populares — OAuth 2.0 (protocolo de delegação de acesso) e JWT (JSON Web Tokens) — são frequentemente usados juntos para criar APIs seguras. Neste artigo, vamos detalhar como implementar autorização OAuth 2.0 e JWT em JavaScript (Node.js) do zero.
Você aprenderá:
- O que é OAuth 2.0 e por que ele é necessário
- Como funcionam os tokens JWT
- Como configurar um servidor de autorização no Express
- Como proteger rotas usando middleware
Fundamentos do OAuth 2.0: fluxos e papéis
O OAuth 2.0 define quatro papéis: Resource Owner (usuário), Client (aplicação), Authorization Server (servidor que emite tokens) e Resource Server (servidor que fornece dados). O fluxo mais comum é o Authorization Code Grant, usado em aplicações web.
Neste artigo, focaremos na implementação de um Resource Server e Authorization Server usando JWT, em vez de provedores externos (Google, GitHub). Isso lhe dará controle total sobre o processo.
Instalação de dependências
Para começar, crie um novo projeto Node.js e instale os pacotes necessários:
npm init -y
npm install express jsonwebtoken bcrypt dotenv cors
Descrição dos pacotes:
express— framework para criar o servidorjsonwebtoken— criação e verificação de JWTbcrypt— hash de senhasdotenv— trabalho com variáveis de ambientecors— configuração de CORS para a API
Implementação de autorização JWT em Node.js
JWT é um token compacto composto por três partes: cabeçalho, payload (carga útil) e assinatura. Vamos usá-lo para autenticar usuários após um login bem-sucedido.
Configuração do servidor e modelo de usuário
Crie o arquivo server.js e defina a estrutura básica:
require('dotenv').config();
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const cors = require('cors');
const app = express();
app.use(express.json());
app.use(cors());
const PORT = process.env.PORT || 3000;
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
// Armazenamento temporário de usuários (em produção, use um banco de dados)
const users = [];
Registro e hash de senhas
No registro, a senha deve ser transformada em hash usando bcrypt:
app.post('/api/register', async (req, res) => {
try {
const { email, password } = req.body;
// Verificar se o usuário já existe
const existingUser = users.find(u => u.email === email);
if (existingUser) {
return res.status(400).json({ message: 'Usuário já existe' });
}
// Hash da senha
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = { id: users.length + 1, email, password: hashedPassword };
users.push(newUser);
res.status(201).json({ message: 'Usuário criado' });
} catch (error) {
res.status(500).json({ message: 'Erro do servidor' });
}
});
Login e geração do token JWT
Após verificar as credenciais, geramos o token usando jsonwebtoken:
app.post('/api/login', async (req, res) => {
try {
const { email, password } = req.body;
// Buscar usuário
const user = users.find(u => u.email === email);
if (!user) {
```