Olá Gabriel.
Tudo bem?
Entendo sua dúvida e vou tentar te ajudar com um exemplo prático sobre como implementar a autenticação usando JWT (JSON Web Token) com React.
Passo 1: Gerar o JWT na API (Back-end)
No seu back-end (Node.js), você precisa criar uma rota de login que vai gerar o token JWT quando o usuário fornecer credenciais válidas. Aqui está um exemplo usando o pacote jsonwebtoken
:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const users = [{ id: 1, username: 'user', password: 'password' }]; // Exemplo de usuário
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
const token = jwt.sign({ id: user.id }, 'seu_segredo', { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).json({ error: 'Credenciais inválidas' });
}
});
app.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Passo 2: Consumir o JWT no Front-end (React)
No seu front-end em React, você precisa fazer a requisição para a API de login e armazenar o token JWT recebido. Aqui está um exemplo usando fetch
:
import React, { useState } from 'react';
function Login() {
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [token, setToken] = useState(null);
const handleLogin = async () => {
const response = await fetch('http://localhost:3000/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
});
const data = await response.json();
if (response.ok) {
setToken(data.token);
localStorage.setItem('token', data.token); // Armazenar o token no localStorage
} else {
alert(data.error);
}
};
return (
<div>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
placeholder="Username"
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Password"
/>
<button onClick={handleLogin}>Login</button>
{token && <p>Token: {token}</p>}
</div>
);
}
export default Login;
Passo 3: Utilizar o JWT para acessar rotas protegidas
Para acessar rotas protegidas na sua API, você precisa enviar o token JWT no cabeçalho das requisições. Aqui está um exemplo de como fazer isso:
const fetchProtectedData = async () => {
const token = localStorage.getItem('token');
const response = await fetch('http://localhost:3000/protected', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
const data = await response.json();
if (response.ok) {
console.log(data);
} else {
console.error('Erro ao acessar a rota protegida', data);
}
};
E no seu back-end, você precisa verificar o token nas rotas protegidas:
const verifyToken = (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(403).json({ error: 'Token não fornecido' });
jwt.verify(token, 'seu_segredo', (err, decoded) => {
if (err) return res.status(401).json({ error: 'Token inválido' });
req.userId = decoded.id;
next();
});
};
app.get('/protected', verifyToken, (req, res) => {
res.json({ message: 'Acesso concedido', userId: req.userId });
});
É só um exemplo para você visualizar e ter uma noção de como é feito.
Espero ter ajudado de alguma forma. Qualquer dúvida manda aqui. Bons estudos.