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.
Estrutura
O 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>
Header
A 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 hash
Parâ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 Claims
A 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 Claims
Alguns 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"
}
}
}
Signature
A 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.
Resultado
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJub21lIjoiRnVsYW5vIiwiYWRtaW4iOnRydWV9
.
IShPdPgMqjygLcv6FpePbFuRLJHBTdeKSNDQIpR-X2E
Fluxo de requisição
Fluxo de uso de JWT para um CLIENT
1. 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 SERVER
1. 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-passo
Tarefa para casa: Assistir o vídeo
https://www.youtube.com/watch?v=k3KfK0ZS_FY
Mario Mendonça
Software Developer
mario.mendonca@gmail.com
https://br.linkedin.com/in/mario-mendonca
Alessandro Rodrigues
Software Developer
alessandro.lages@gmail.com
https://br.linkedin.com/in/alessandror
Referências
https://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

JWT - Json Web Token

  • 1.
  • 2.
    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.
  • 3.
    Estrutura O 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>
  • 4.
    Header A primeira parteda 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" }
  • 5.
    Algoritmo de hash ParâmetroAlgoritmo 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
  • 6.
    Payload ou Claims Asegunda é 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.
  • 7.
    Exemplos de Claims Algunsexemplos 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
  • 8.
    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" } } }
  • 9.
    Signature A 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.
  • 10.
  • 11.
  • 12.
    Fluxo de usode JWT para um CLIENT 1. 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.
  • 13.
    Fluxo de usode JWT para o SERVER 1. 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.
  • 14.
    Implementação - No siteoficial 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.
  • 15.
  • 16.
  • 17.
    Vídeo com passo-a-passo Tarefapara casa: Assistir o vídeo https://www.youtube.com/watch?v=k3KfK0ZS_FY
  • 18.
    Mario Mendonça Software Developer mario.mendonca@gmail.com https://br.linkedin.com/in/mario-mendonca AlessandroRodrigues Software Developer alessandro.lages@gmail.com https://br.linkedin.com/in/alessandror
  • 19.