OAuth 2.0 e autorização JWT em JavaScript: na prática
\n\nAs aplicações web modernas raramente prescindem de um sistema de autenticação e autorização. Os dois padrões mais populares — OAuth 2.0 e JWT (JSON Web Tokens) — são frequentemente usados juntos para criar soluções seguras e escaláveis. Neste artigo, vamos abordar como implementar OAuth 2.0 e autorização JWT em JavaScript (Node.js) com exemplos práticos de código.
\n\nO material será útil tanto para desenvolvedores iniciantes quanto para experientes que desejam compreender mais profundamente os mecanismos de funcionamento dos tokens e do acesso delegado.
\n\nO que são OAuth 2.0 e JWT?
\n\nOAuth 2.0 é um protocolo de autorização que permite que aplicações obtenham acesso limitado aos recursos do usuário sem transmitir suas credenciais. Por exemplo, você pode fazer login em um site através do Google ou GitHub — isso é OAuth 2.0.
\n\nJWT (JSON Web Token) é um formato compacto de token que contém dados codificados (payload) e uma assinatura. O JWT é usado para transmitir informações entre as partes (cliente e servidor) e verificar sua autenticidade.
\n\nEm conjunto, o OAuth 2.0 atua como protocolo de emissão de tokens, e o JWT como formato dos próprios tokens de acesso.
\n\nConfiguração do servidor e instalação das dependências
\n\nPara começar, vamos criar um servidor simples com Express.js e instalar os pacotes necessários:
\n\nnpm init -y\nnpm install express jsonwebtoken dotenv cors axios\nnpm install --save-dev nodemon\n\nEstrutura do projeto:
\n- \n
server.js— arquivo principal do servidor \n .env— variáveis de ambiente \n middleware/auth.js— middleware para verificação JWT \n routes/auth.js— rotas de autenticação \n
Implementação da autorização JWT
\n\nVamos começar com a geração e verificação básica de tokens JWT. Crie o arquivo server.js:
const express = require('express');\nconst jwt = require('jsonwebtoken');\nrequire('dotenv').config();\n\nconst app = express();\napp.use(express.json());\n\nconst SECRET_KEY = process.env.JWT_SECRET || 'my_secret_key';\n\n// Geração do token\nfunction generateToken(user) {\n const payload = {\n id: user.id,\n email: user.email,\n role: user.role\n };\n return jwt.sign(payload, SECRET_KEY, { expiresIn: '1h' });\n}\n\n// Exemplo de rota de login\napp.post('/login', (req, res) => {\n const { email, password } = req.body;\n // Aqui deve haver verificação no banco de dados\n const user = { id: 1, email, role: 'user' };\n const token = generateToken(user);\n res.json({ token });\n});\n\n// Middleware para verificação do token\nfunction authenticateToken(req, res, next) {\n const authHeader = req.headers['authorization'];\n const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN\n\n if (!token) {\n return res.status(401).json({ error: 'Token não fornecido' });\n }\n\n jwt.verify(token, SECRET_KEY, (err, user) => {\n if (err) {\n return res.status(403).json({ error: 'Token inválido' });\n }\n req.user = user;\n next();\n });\n}\n\n// Rota protegida\napp.get('/profile', authenticateToken, (req, res) => {\n res.json({ message: 'Acesso permitido', user: req.user });\n});\n\napp.listen(3000, () => console.log('Servidor iniciado na porta 3000'));\n\nIntegração OAuth 2.0 via Google
\n\nAgora vamos adicionar OAuth 2.0 usando o Google como provedor. Crie o arquivo routes/auth.js:
const express = require('express');\nconst axios = require('axios');\nconst jwt = require('jsonwebtoken');\nconst router = express.Router();\n\nconst GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID;\nconst GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET;\nconst REDIRECT_URI = 'http://localhost:3000/auth/google/callback';\nconst JWT_SECRET = process.env.JWT_SECRET;\n\n// Rota para iniciar