Introdução: por que OAuth 2.0 e JWT são o padrão da autorização moderna
No desenvolvimento web moderno, a autenticação e autorização seguras de usuários são uma das tarefas principais. Os dois protocolos e formatos mais populares que resolvem essa tarefa são OAuth 2.0 e JWT (JSON Web Token). Apesar de serem frequentemente usados juntos, são coisas diferentes: OAuth 2.0 é um protocolo de delegação de acesso, enquanto JWT é um formato de token.
Neste artigo, vamos analisar como funciona o OAuth 2.0, o que é JWT e como implementá-los em JavaScript (Node.js). O material é voltado para desenvolvedores iniciantes, então vamos progredir da teoria à prática com exemplos de código claros.
O que é OAuth 2.0 e como funciona
OAuth 2.0 (Open Authorization) é um protocolo que permite que um aplicativo obtenha acesso limitado aos recursos de um usuário sem transmitir seu login e senha. Imagine que você queira entrar em um site pelo Google ou GitHub — isso é OAuth 2.0.
Papéis principais no OAuth 2.0
- Resource Owner — usuário proprietário dos dados
- Client — aplicativo que solicita acesso
- Authorization Server — servidor que emite tokens (ex.: Google)
- Resource Server — servidor que armazena os dados do usuário
Fluxo Authorization Code Grant (exemplo com Node.js)
O fluxo OAuth 2.0 mais comum e seguro é o Authorization Code Grant. Vamos analisar sua implementação usando Express.js.
// Instalação de dependências// npm install express axios dotenv
// .envCLIENT_ID=your_client_idCLIENT_SECRET=your_client_secretREDIRECT_URI=http://localhost:3000/callbackconst express = require('express');const axios = require('axios');require('dotenv').config();
const app = express();
// Passo 1: Redirecionar o usuário para a página de autorizaçãoapp.get('/auth', (req, res) => { const authUrl = `https://provider.com/oauth/authorize?client_id=${process.env.CLIENT_ID}&redirect_uri=${process.env.REDIRECT_URI}&response_type=code&scope=email`; res.redirect(authUrl);});
// Passo 2: Processar o callback com o authorization codeapp.get('/callback', async (req, res) => { const { code } = req.query;
try { // Trocar o authorization code por um access token const tokenResponse = await axios.post('https://provider.com/oauth/token', { client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, code, redirect_uri: process.env.REDIRECT_URI, grant_type: 'authorization_code' });
const { access_token, refresh_token } = tokenResponse.data; // Salvar os tokens (em um projeto real, no banco de dados) req.session.accessToken = access_token; req.session.refreshToken = refresh_token;
res.send('Autorização bem-sucedida!'); } catch (error) { res.status(500).send('Erro de autorização'); }});
app.listen(3000, () => console.log('Servidor rodando na porta 3000'));JWT (JSON Web Token): estrutura e criação
JWT é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. O token consiste em três partes separadas por pontos:
- Header — tipo de token e algoritmo de assinatura (ex.: HS256)
- Payload — dados (claims) que queremos transmitir
- Signature — assinatura que garante a integridade dos dados
Criação de JWT em Node.js
Para trabalhar com JWT, usaremos a biblioteca jsonwebtoken.
// npm install jsonwebtoken
const jwt = require('jsonwebtoken');
const secretKey = 'seu_segredo