Article image
João Ribas
João Ribas28/02/2023 12:06
Compartilhe

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.

fonte: OpenIA
Compartilhe
Comentários (2)
João Ribas
João Ribas - 28/02/2023 13:44

Isso mesmo. Ótimo comentário.

Moacir Gonçalves
Moacir Gonçalves - 28/02/2023 12:19

Boa, João!

Já utilizei o JWT junto com o BCrypt , que faz um hash da senha, por exemplo, antes de enviar pro banco de dados (na hora do cadastro do usuário) e no login, o BCrypt faz uma comparação entre a senha que o usuário digitou no input e o hash armazenado no banco de dados. Uma camada de segurança a mais!!