Upload
mario-mendonca
View
97
Download
2
Embed Size (px)
Citation preview
JWT
(Json Web Token)
O que é JWT?Do site oficial:JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. – http://jwt.io
Traduzindo, é um padrão aberto que define uma forma compacta e auto-contida para transmitir de forma segura, informações entre duas partes como objeto JSON.
EstruturaO token é formado por 3 partes separados por pontos (.):
Header
Payload
Signature
São 3 partes, separadas por um . (ponto), encodadas por base64 individualmente:
<base64-encoded header>.<base64-encoded claims>.<base64-encoded assinatura>
HeaderA primeira parte da estrutura é seu header que contém informações sobre qual criptografia está sendo usada. Consiste em 2 partes encodados em Base64:
O tipo (JWT)
E o algoritmo de hash usado (HMAC SHA256 ou RSA).
{
"alg": "HS256",
"typ": "JWT"
}
Algoritmo de hashParâmetro Algoritmo
HS256 HMAC usando algoritmo hash SHA-256
HS384 HMAC usando algoritmo hash SHA-384
HS512 HMAC usando algoritmo hash SHA-512
RS256 RSA usando algoritmo hash SHA-256
RS384 RSA usando algoritmo hash SHA-384
RS512 RSA usando algoritmo hash SHA-512
ES256 ECDSA usando algoritmo hash P-256 e SHA-256
ES384 ECDSA usando algoritmo hash P-384 e SHA-384
ES512 ECDSA usando algoritmo hash P-521 e SHA-512
Payload ou ClaimsA segunda é seu conteúdo. O Conteúdo de um JWT são Claims. Claims são informações que seu JWT passa como pares de chave valor para seu servidor validar.
Existem 2 tipos de Claims que são Reserved Claims , que são Claims já pré-definidos (compare com keywords de uma linguagem) e Application Defined Claims , que são Claims “customizados”, que você vai criar para sua aplicação usar.
Exemplos de ClaimsAlguns exemplos de Reserved Claims são:
“iss” (Issuer): Informar da onde o token está vindo.
“iat” (IssuedAt): Quando o token foi gerado.
“exp” (Expiration): Quando o token expira.
“sub” (Subject): A entidade a quem este token pertence (geralmente o Id do usuário)
http://www.iana.org/assignments/jwt/jwt.xhtml
Exemplo de Payload{ "iss": "localhost:4039132", "iat": 1300819370, "exp": 1300819380, "sub": "21EC2020-3AEA-4069-A2DD-08002B30309D", "context": { "user": { "userKey": "21EC2020-3AEA-4069-A2DD-08002B30309D", "username": "bwayne", "displayName": "Bruce Wayne" } }}
SignatureA terceira é a assinatura do token, ou seja, se queremos garantir que o token não foi corrompido podemos usar a Signature(Assinatura) com o Header para isso.
Para assinar o token, usamos a Header, Payload, o algoritmo definido na header, um secret.
Assim, no exemplo, foi usado o HMAC SHA256 (HS256), então teríamos:
HMACSHA256(header + "." + payload, secret)
Onde header e payload já estão encodados em Base64.
ResultadoeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJub21lIjoiRnVsYW5vIiwiYWRtaW4iOnRydWV9
.
IShPdPgMqjygLcv6FpePbFuRLJHBTdeKSNDQIpR-X2E
Fluxo de requisição
Fluxo de uso de JWT para um CLIENT1.Quero acessar uma rota protegida, tipo /users
2.Faço o login, enviando (de forma segura, por https) usuário e senha.
3.Login com sucesso, recebe o ‘TOKEN’. Guardo pra usar depois
4.Faço a requisição que eu queria na /users porém, com o http Header Authorization: meutokenaqui
5.Com o token enviado, o servidor me identifica e autoriza (ou não) meu acesso, retornando a resposta à minha requisição.
Fluxo de uso de JWT para o SERVER1.Se tentarem acessar uma rota protegida sem token, não autoriza.
2.Se tentar acessar com um token, verifica se é válido. Se for, consegue identificar o usuário pelo TOKEN e libera o acesso.
3.Quando um usuário faz login, geramos um token, para ele poder fazer requisições autenticadas.
Implementação- No site oficial do JWT (jwt.io) existem links para diversas bibliotecas
para várias linguagens de programação.
- Também no site oficial é possível verificar se a lib implementa completamente todos os recursos do JWT.
- No Packagist (https://packagist.org/) também encontramos várias opções
- Possibilidade de implementar manualmente o protocolo, sem utilização de libs de terceiros.
JWT.io - Implementação do padrão
JWT.io - Playground
Vídeo com passo-a-passoTarefa para casa: Assistir o vídeohttps://www.youtube.com/watch?v=k3KfK0ZS_FY
Mario MendonçaSoftware Developer
[email protected]://br.linkedin.com/in/mario-mendonca
Alessandro RodriguesSoftware Developer
[email protected]://br.linkedin.com/in/alessandror
Referênciashttps://jwt.io/
http://rcdevlabs.github.io/2015/02/12/como-criar-uma-api-restfull-em-nodejs-e-autenticar-usando-json-web-token-jwt/
https://rafaell-lycan.com/2016/autenticacao-jwt-angular-app/
https://blog.lucaskatayama.com/posts/2016/03/30/JSON-Web-Token-JWT/#sthash.hY39j4ZE.dpbs
http://rafael-miceli.com.br/oauth/2016/04/18/JWT.html