JSON Web Token é um padrão usado para criar tokens de Acesso para uma aplicação.
ele funciona desta forma: o servidor gera um token que certifica a identidade do Usuário, e envia para o cliente.
o cliente irá enviar o token de volta para o servidor para cada pedido subsequente, para que o servidor saiba que o pedido vem de uma determinada identidade.
esta arquitetura prova ser muito eficaz em aplicações Web modernas, onde depois que o Usuário é autenticado, Realizamos pedidos de API tanto para um descanso ou uma API de GraphQL.quem usa o JWT?, Google, por exemplo. Se utilizar a APIs do Google, utilizará o JWT.
um JWT é assinado criptograficamente (mas não criptografado, portanto usando HTTPS é obrigatório ao armazenar dados do usuário no JWT), então há uma garantia de que podemos confiar Nele quando o recebemos, como nenhum intermediário pode interceptá-lo e modificá-lo, ou os dados que ele detém, sem invalidá-lo.
dito isso, JWTs são muitas vezes criticados por seu uso excessivo, e especialmente por eles serem usados quando soluções menos problemáticas podem ser usadas.
Você precisa formar sua opinião sobre o assunto., Não estou defendendo uma tecnologia em vez de outra, apenas apresentando todas as oportunidades e ferramentas que você tem à sua disposição.para que servem? Principalmente autenticação API, e autorização servidor-a-servidor.
como é gerado um token JWT?
Usando o nó.,js pode gerar a primeira parte do token usando este código:
const header = { "alg": "HS256", "typ": "JWT" }const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64')
Vamos definir o algoritmo de assinatura será de HMAC SHA256
(JWT suporta vários algoritmos), então vamos criar um buffer a partir deste JSON-codificado objeto, e nós codificá-lo usando base64.
O Resultado parcial é eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.a seguir adicionamos a carga útil, que podemos personalizar com qualquer tipo de dados., Há reservados chaves, incluindo iss
e exp
que identificam o emissor e o tempo de expiração do token.
Você pode adicionar seus próprios dados para o token usando um objeto:
const payload = { username: 'Flavio' }
Nós converter este objeto JSON-codificado, para um Buffer e codificamos o resultado usando base64, assim como fizemos antes:
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64')
neste caso, o resultado parcial é eyJ1c2VybmFtZSI6IkZsYXZpbyJ9
.,
a seguir, obtemos uma Assinatura a partir do cabeçalho e conteúdo de carga útil, o que garante que o nosso conteúdo não pode ser alterado, mesmo se interceptado como a nossa assinatura será invalidada. Para isso, usaremos o módulo de nó
crypto
Node:
usaremos osecretKey
chave secreta e criaremos uma representação codificada base64 da assinatura encriptada.,
O valor da assinatura no nosso caso é
MQWECYWUT7bayj8miVgsj8KdYI3ZRVS+WRRZjfZrGrw=
Estamos quase pronto, só precisamos concatenar as 3 partes do cabeçalho da carga útil e da assinatura separando-os com um ponto:
const jwt = `${encodedHeader}.${encodedPayload}.${signature}`
API de autenticação
Esta é provavelmente a única forma sensata de usar JWT.
um cenário comum é: você se inscrever para um serviço e baixar um JWT do painel de serviço. Isto é o que você vai usar a partir de agora para autenticar todos os seus pedidos para o servidor.,
Outro caso de uso, que é o oposto, está a enviar a JWT quando você gerenciar a API e os clientes se conectam a você, e você quer que seus usuários enviem solicitações subseqüentes por apenas passando o token.
neste caso, o cliente precisa armazenar o token em algum lugar. Onde é o melhor lugar? Num biscoito HttpOnly. Os outros métodos são todos propensos a ataques XSS e, como tal, eles devem ser evitados. Um cookie HttpOnly não é acessível a partir de JavaScript, e é automaticamente enviado para o servidor de origem a cada pedido, então ele se encaixa perfeitamente no caso de uso.,
escolha a melhor biblioteca JWT
dependendo da língua e do ambiente que usar, pode escolher entre várias bibliotecas. Os mais populares estão listados no jwt.io website.
não use o JWTs como tokens de sessão
não deverá usar o JWTs para as sessões. Use um mecanismo de sessão regular do lado do servidor, pois é muito mais eficiente e menos propenso à exposição de dados.