JWT - O que é? Como funciona?
- #PHP
- #JavaScript
- #Java
O que é?
JWT (JSON Web Token) é um padrão aberto (RFC 7519) para transmitir informações confiáveis e seguras entre partes. Ele consiste em uma cadeia compacta e auto-assinada de informações codificadas em formato JSON, que podem ser usadas para autenticação e autorização. JWT é comumente usado para autenticação de usuários em aplicativos web e mobile, e também pode ser usado para comunicação entre sistemas.
O JWT é um padrão aberto que pode ser usado em qualquer aplicativo que precisa transmitir informações confiáveis e seguras entre as partes, independentemente da plataforma ou linguagem de programação.
Como funciona?
O fluxo de trabalho do JWT é dividido em três etapas:
1 - Geração do Token:
A primeira etapa é a geração do token JWT. Nessa etapa, um servidor ou aplicativo gera um token JWT contendo as informações necessárias para autenticar o usuário. O token é geralmente gerado após o usuário fornecer suas credenciais (como nome de usuário e senha) e o servidor verificar essas credenciais. O token é assinado com uma chave secreta que só é conhecida pelo servidor ou aplicativo que gerou o token.
2 - Envio do Token:
A segunda etapa é o envio do token JWT. Nessa etapa, o servidor ou aplicativo envia o token JWT para o cliente, geralmente em um cabeçalho HTTP "Authorization". O cliente armazena o token para uso posterior, como em solicitações subsequentes para o servidor.
3 - Verificação do Token:
A terceira etapa é a verificação do token JWT. Nessa etapa, o servidor ou aplicativo verifica se o token JWT enviado pelo cliente é válido. O servidor verifica a assinatura do token usando a chave secreta que só é conhecida pelo servidor. Se a assinatura estiver correta, o servidor extrai as informações do token e verifica se o usuário tem permissão para acessar o recurso solicitado. Se o token for inválido ou expirado, o servidor nega o acesso ao recurso solicitado.
Veja um diagrama do fluxo de trabalho aqui.
Veja a estrutura do JWT aqui.
Caso de uso usando Node.js:
1 - Instale as dependências do pacote "jsonwebtoken"
npm install jsonwebtoken
2 - Importe o pacote e crie uma chave secreta para assinar o token JWT:
const jwt = require('jsonwebtoken');
const secret = 'mysecretkey';
3 - Crie uma função de autenticação que gera um token JWT quando um usuário fornece credenciais válidas:
function authenticate(req, res, next) {
// Obtenha as credenciais do usuário a partir do corpo da solicitação
const { username, password } = req.body;
// Verifique se as credenciais são válidas
if (username === 'admin' && password === 'password') {
// Crie o payload para o token JWT
const payload = {
username,
};
// Gerar o token JWT
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
// Adiciona o token ao cabeçalho da resposta
res.setHeader('Authorization', `Bearer ${token}`);
next();
} else {
// Retorna um erro 401 se as credenciais são inválidas
res.status(401).json({ message: 'Invalid credentials' });
}
}
4 - Use essa função de autenticação em suas rotas protegidas para verificar se o usuário está autenticado antes de permitir o acesso a essas rotas:
app.post('/login', authenticate, (req, res) => {
res.json({ message: 'Authenticated' });
});
5 - Para validar o token, use a função verify
function protected(req, res, next) {
// Obtém o token do cabeçalho da solicitação
const token = req.headers.authorization;
// Verifica se o token é válido
jwt.verify(token, secret, (err, decoded) => {
if (err) {
res.status(401).json({ message: 'Invalid token' });
} else {
req.decoded = decoded;
next();
}
});
}
6 - Use essa função de proteção em suas rotas protegidas:
app.get('/profile', protected, (req, res) => {
res.json({ message: 'Protected', decoded: req.decoded });
});
Este é um exemplo básico, mas é importante ter em mente que é necessário tratar a segurança de forma adequada e proteger as chaves secret.