SlideShare uma empresa Scribd logo
1 de 10
Neste post vou explicar um pouco sobre o funcionamento do
JWT, como ele segue a especificação RFC 7519 é necessário usar
alguma implementação e para este post vou usar apache oltu que é
uma implementação da apache. Existem outras diversas
implementações como a do Spring e etc.
| Introdução
JSON Web Token (JWT) é um padrão aberto baseado na ( RFC
7519 ) que define uma estrutura compacta para tráfego de dados
úteis e com segurança nas permissões entre partes interessadas,
estes dados são validados e são assinados digitalmente, podemos
assinar um JWT usando um secret com o algoritmo HMAC ou
usando par de chaves público-privadas usando RSA. Por ser
compacto ele e rápido e pode ser enviado pela através da URL,
por parâmetro ou dentro de um header HTTP. O token JWT
carrega dados que serão úteis para a aplicação. O JWT se encaixa
perfeitamente em dois cenários, autenticações ou na troca de
informação, o uso mais comum hoje e em autenticações e ainda
mais que hoje temos a grande popularidade das aplicações single
page o JWT e uma ótima solução, o fluxo mais comum e ao
realizar o login na aplicação receber no retorno o token JWT que
será armazenado no localstorage e a cada nova requisição feita ao
backend será passado o Authorization: Bearer <token> no
cabeçalho HTTP que foi armazenado anteriormente no
Localstorage , quando o backend receber o token fará a validação
do token conferindo sua autenticidade, em caso de válido o
recurso é liberado, caso não retorna erro HTTP 403. No decorrer
do post vou detalhar melhor o uso e estrutura do JWT.
| Estrutura
JSON Web Token contém 3 partes:
 Header
 Payload
 Signature
O JWT geralmente fica da seguinte forma:
header.payload.signature
As partes são divididas por (.), a seguir vamos detalhar cada uma
das partes.
| Header
A primeira parte da estrutura do JWT é o header que contém as
informações sobre qual criptografia está sendo usada, podemos
ver um exemplo logo abaixo, o typ representa o tipo que e JWT e
o alg representa o algoritmo que está sendo usado, podemos usar
algoritmos HMAC SHA ou RSA e cty e o content-type.
Atributos do header:
typ (Tipo do token)
alg (Define o algoritmo usado)
cty (Define content-type)
{
"typ": "JWT",
"alg": "HS256",
"cty": "text/html"
}
| Tipos de algoritmos
Tipo Algoritmo Descrição
HS256 HMAC using SHA-256
HS384 HMAC using SHA-384
HS512 HMAC using SHA-512
RS256 RSASSA-PKCS1-v1_5 using SHA-256
RS384 RSASSA-PKCS1-v1_5 using SHA-384
RS512 RSASSA-PKCS1-v1_5 using SHA-512
ES256 ECDSA using P-256 and SHA-256
ES384 ECDSA using P-384 and SHA-384
ES512 ECDSA using P-521 and SHA-512
PS256 RSASSA-PSS using SHA-256 and MGF1 with SHA-256
PS384 RSASSA-PSS using SHA-384 and MGF1 with SHA-384
PS512 RSASSA-PSS using SHA-512 and MGF1 with SHA-512
| Payload (Claims)
Claims reservados
Essas são as claims definidas pela especificação IANA JSON
Web Token Claims estas claims já são pré-definidas, não são
obrigatórias (Mas recomendadas), são um conjunto de
informações úteis e interoperáveis podendo ser utilizados por
protocolos de segurança em várias APIs.
lista de claims pré-definidas abaixo:
Nome Descrição Claim
iss Issuer(Quem emitiu o token)
sub Subject(Quempertence o token, geralmente id do usuário)
aud Audience(identifica os destinatários para os quais o JWT se destina)
exp Expiration Time(Timestamp quando expira)
nbf Not Before(Timestamp a partir de quando o token pode ser usado)
iat Issued At(Timestamp quando foi emitido o token)
jti JWT ID (identificador único do token.)
Exemplo de payload:
{
"sub": "33743568",
"name": "Rodrigo araújo",
"admin": true,
....
}
Claims públicos
São atributos que definem o uso do JWT e informações úteis para
a aplicação o ideal é usar identificadores diferentes para evitar
colisões, uma vez que são claims públicas o ideal é fazer o uso de
URI ou URL para reduzir a possibilidade de colisões.
{
"http://www.site.com.br/admin": "true"
}
Claims privados
Assim como os claims públicos os privados também necessitam
de evitar colisões.Tanto os claims públicos quanto os privados
devem ser usados com moderação para manter o token o menor
possível usando apenas informações necessárias. Podemos usar
com id de usuário ou qualquer outro dado,sempre opte por nomes
curtos para manter os JWT compactos.
| Signature
A signature e composta por header e payload convertidos para
base64 e mais o secret. No exemplo abaixo a signature foi criado
usando SHA256
HMAC.
String secret = “txt_secreto”;
String header = base64(header);
String payload = base64(payload);
String signature = HMACSHA256(header+"."+payload , secret);
String token = header+"."+payload+"."+signature;
Print do token JWT:
Agora vamos fazer uma demonstração da criação e validação do
JWT e para isso vamos usar o apache Oltu que e uma
implementação do JWT (RFC 7519).
| Dependências Oltu
eyJhbGciOiJTSEEyNTYiLCJ0eXAiOiJKV1QifQ
.eyJhdWQiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvdG9rZW4
iLCJpc3MiOiI3ODg3MzIzNzIwNzgtcGFzNmM0dHF0dWRwb2NvMmY0YXUxOGUwM
HN1ZWRqdGJAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJleHAiOjE0O
TUzMzYzNDQsImlhdCI6MTQ5NTMzMjc0NCwic2NvcGUiOiIgaHR0cHM6Ly93d3cuZ2
9vZ2xlYXBpcy5jb20vYXV0aC9wbHVzLmxvZ2luIn0
.9kt1zMrD5XK57KVNLQRy_3h2vpz7Pm7nVt7M4hgcfdE
<!--
https://mvnrepository.com/artifact/org.apache.oltu.oauth2/org.apache.oltu.oaut
h2.jwt -->
<dependency>
<groupId>org.apache.oltu.oauth2</groupId>
<artifactId>org.apache.oltu.oauth2.jwt</artifactId>
<version>1.0.0</version>
</dependency>
<!--
https://mvnrepository.com/artifact/org.apache.oltu.jose/org.apache.oltu.jose.jws
-->
<dependency>
<groupId>org.apache.oltu.jose</groupId>
<artifactId>org.apache.oltu.jose.jws</artifactId>
<version>1.0.0</version>
</dependency>
| Exemplo JWT
//chave que é usada na assinatura
String pk = "nomeSecreat";
// Classe que possui métodos de criação de signature e validação.
SignatureMethodsHMAC256Impl sHmacImpl = new
SignatureMethodsHMAC256Impl();
// classe que recebe o array de bytes do secret para gerar signature
SymmetricKeyImpl key = new SymmetricKeyImpl(pk.getBytes());
//Criar estrutura jwt
JWT jwt = new JWT.Builder()
.setHeaderType(TipoTyp.JWT.getValor())
. .setHeaderAlgorithm(TipoAlgoritimo.SHA256.getValor())
.setClaimsSetIssuer("https://api.site.com")
.setClaimsSetSubject("33743568")
.setClaimsSetAudience("https://accounts.site.com/o/oauth2/token")
.setClaimsSetExpirationTime(System.currentTimeMillis() / 1000 +3600)
.setClaimsSetIssuedAt(System.currentTimeMillis() / 1000)
.setClaimsSetJwdId("id_87594353")
.setClaimsSetCustomField("nome","Rodrigo Araújo")
.setClaimsSetCustomField("admin",true)
.build();
String header = new JWTHeaderWriter().write(jwt.getHeader());
String payload = new JWTClaimsSetWriter().write(jwt.getClaimsSet());
System.out.println(jwt.getHeader());
/* Imprime: {typ: JWT, alg: SHA256,cty:null} */
System.out.println(header);
/* O JWTHeaderWriter().write validar se tem algum atributo nulo */
/* Imprime: {alg:SHA256,typ:JWT} */
public static void main(String[] args) {
System.out.println(jwt.getClaimsSet());
/* Imprime: {iss: https://api.site.com,
sub: 33743568,
aud: https://accounts.google.com/o/oauth2/token,
exp: 1495383435,
nbf: null,
iat: 1495379835,
jti: id_87594353,
typ: null } */
System.out.println(payload);
/* O JWTClaimsSetWriter().write validar se tem algum atributo nulo */
/* Imprime: {aud:"https://accounts.google.com/o/oauth2/token",
iss:"https://api.site.com",
jti:"id_87594353",
sub:"33743568",
exp:1495383435,
iat:1495379835,
admin:true} */
//converte header e payload em base64
JWTReader jheader = new JWTReader();
header = jheader.base64Encode(header);
payload = jheader.base64Encode(payload);
//cria a signature usando SHA256
String signature = sHmacImpl.calculate(header, payload, key);
System.out.println(signature );
//Imprime a signature - qMwn57yT1g9azJF-zDatMliElq-rdFNgkuB1gTQwfLY
String token = header+"."+payload+"."+signature;
System.out.println(token);
/* Imprime o token JWT :
eyJhbGciOiJTSEEyNTYiLCJ0eXAiOiJKV1QifQ
.eyJhdWQiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvd
G9rZW4iLCJpc3MiOiJodHRwczovL2FwaS5zaXRlLmNvbSIsImp0aSI6ImlkXzg3
NTk0MzUzIiwic3ViIjoiMzM3NDM1NjgiLCJleHAiOjE0OTUzODQ1MzksImlhdCI6
MTQ5NTM4MDkzOSwiYWRtaW4iOnRydWV9
.qMwn57yT1g9azJF-zDatMliElq-rdFNgkuB1gTQwfLY
O token pode ser enviado para o browser...
*/
}
A imagem abaixo reflete muito bem o fluxo, na primeira ação a
aplicação faz login mandando um POST com usuário e senha, ao
se confirmar as credenciais enviadas será criado o token JWT que
é retornado para o browser armazená-lo e a cada nova requisição
que for realizada o token será passado no header Authorization:
Bearer<token>
O último fluxo vai checar a autenticidade do token JWT onde a
aplicação checar o token com a secret e fará a validação, caso seja
um token válido o recurso é liberado.
Boolean autentico = sHmacImpl.verify(signature, header, payload, key);
if(autentico){
System.out.println("Token válido");
}
else
{
System.out.println("Token inválido");
}
Este é um primeiro post sobre JWT mais fazendo uma breve
explanação, os próximos posts serão mais práticos e os próximos
serão:
1 - Usar a autenticação com JWT e angular; 1.x
2 - Autenticações com OAuth2 - Implementação do apache Oltu:
 OAuth 2.0 Authorization Server
 OAuth 2.0 Client
 OAuth 2.0 Resource Server
 OAuth 2 server to server
3 - Autenticações com OAuth2 e angular 1.x
Ate à próxima...
REFERÊNCIAS
https://tools.ietf.org/html/rfc7519
https://jwt.io
https://oltu.apache.org/

Mais conteúdo relacionado

Mais procurados

WSO2 ESB Integration with REST
WSO2 ESB Integration with RESTWSO2 ESB Integration with REST
WSO2 ESB Integration with RESTWSO2
 
Shootout! Template engines for the JVM
Shootout! Template engines for the JVMShootout! Template engines for the JVM
Shootout! Template engines for the JVMJeroen Reijn
 
Spring Boot—Production Boost
Spring Boot—Production BoostSpring Boot—Production Boost
Spring Boot—Production BoostVMware Tanzu
 
An Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersAn Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersKento Aoyama
 
Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB WSO2
 
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용Jihyung Song
 
Making Developers Productive with Vagrant, VirtualBox, and Docker
Making Developers Productive with Vagrant, VirtualBox, and DockerMaking Developers Productive with Vagrant, VirtualBox, and Docker
Making Developers Productive with Vagrant, VirtualBox, and DockerJohn Rofrano
 
Writing HTTP Middleware In Go
Writing HTTP Middleware In GoWriting HTTP Middleware In Go
Writing HTTP Middleware In GoShiju Varghese
 
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인Amazon Web Services Korea
 
RESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovRESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovVuqar Suleymanov
 
Amazon VPC Lattice: The Service Mesh you actually want!!
Amazon VPC Lattice: The Service Mesh you actually want!!Amazon VPC Lattice: The Service Mesh you actually want!!
Amazon VPC Lattice: The Service Mesh you actually want!!Aaron Walker
 
Introduction to OS LEVEL Virtualization & Containers
Introduction to OS LEVEL Virtualization & ContainersIntroduction to OS LEVEL Virtualization & Containers
Introduction to OS LEVEL Virtualization & ContainersVaibhav Sharma
 
Logstage - zero-cost-tructured-logging
Logstage - zero-cost-tructured-loggingLogstage - zero-cost-tructured-logging
Logstage - zero-cost-tructured-logging7mind
 
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Haeseok Lee
 
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and Blox
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and BloxNEW LAUNCH! Advanced Task Scheduling with Amazon ECS and Blox
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and BloxAmazon Web Services
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
How Kubernetes helps Devops
How Kubernetes helps DevopsHow Kubernetes helps Devops
How Kubernetes helps DevopsSreenivas Makam
 
A guide of PostgreSQL on Kubernetes
A guide of PostgreSQL on KubernetesA guide of PostgreSQL on Kubernetes
A guide of PostgreSQL on Kubernetest8kobayashi
 

Mais procurados (20)

WSO2 ESB Integration with REST
WSO2 ESB Integration with RESTWSO2 ESB Integration with REST
WSO2 ESB Integration with REST
 
Shootout! Template engines for the JVM
Shootout! Template engines for the JVMShootout! Template engines for the JVM
Shootout! Template engines for the JVM
 
Spring Boot—Production Boost
Spring Boot—Production BoostSpring Boot—Production Boost
Spring Boot—Production Boost
 
An Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersAn Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux Containers
 
Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB
 
Ansible
AnsibleAnsible
Ansible
 
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
 
Making Developers Productive with Vagrant, VirtualBox, and Docker
Making Developers Productive with Vagrant, VirtualBox, and DockerMaking Developers Productive with Vagrant, VirtualBox, and Docker
Making Developers Productive with Vagrant, VirtualBox, and Docker
 
Writing HTTP Middleware In Go
Writing HTTP Middleware In GoWriting HTTP Middleware In Go
Writing HTTP Middleware In Go
 
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
Aurora MySQL Backtrack을 이용한 빠른 복구 방법 - 진교선 :: AWS Database Modernization Day 온라인
 
RESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovRESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar Suleymanov
 
Amazon VPC Lattice: The Service Mesh you actually want!!
Amazon VPC Lattice: The Service Mesh you actually want!!Amazon VPC Lattice: The Service Mesh you actually want!!
Amazon VPC Lattice: The Service Mesh you actually want!!
 
Introduction to OS LEVEL Virtualization & Containers
Introduction to OS LEVEL Virtualization & ContainersIntroduction to OS LEVEL Virtualization & Containers
Introduction to OS LEVEL Virtualization & Containers
 
Logstage - zero-cost-tructured-logging
Logstage - zero-cost-tructured-loggingLogstage - zero-cost-tructured-logging
Logstage - zero-cost-tructured-logging
 
WAF deployment
WAF deploymentWAF deployment
WAF deployment
 
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
 
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and Blox
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and BloxNEW LAUNCH! Advanced Task Scheduling with Amazon ECS and Blox
NEW LAUNCH! Advanced Task Scheduling with Amazon ECS and Blox
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
 
How Kubernetes helps Devops
How Kubernetes helps DevopsHow Kubernetes helps Devops
How Kubernetes helps Devops
 
A guide of PostgreSQL on Kubernetes
A guide of PostgreSQL on KubernetesA guide of PostgreSQL on Kubernetes
A guide of PostgreSQL on Kubernetes
 

Semelhante a Introdução ao JWT com Apache Oltu

Semelhante a Introdução ao JWT com Apache Oltu (20)

JWT - Json Web Token
JWT - Json Web TokenJWT - Json Web Token
JWT - Json Web Token
 
Fiqueemcasa.conf
Fiqueemcasa.confFiqueemcasa.conf
Fiqueemcasa.conf
 
RYSYS Overview
RYSYS OverviewRYSYS Overview
RYSYS Overview
 
Collectd
CollectdCollectd
Collectd
 
Começando com Quorum - versão 2.6
Começando com Quorum - versão 2.6Começando com Quorum - versão 2.6
Começando com Quorum - versão 2.6
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Jwt mais (emoção) segurança na sua aplicação
Jwt   mais (emoção) segurança na sua aplicaçãoJwt   mais (emoção) segurança na sua aplicação
Jwt mais (emoção) segurança na sua aplicação
 
Segurança J2EE
Segurança J2EESegurança J2EE
Segurança J2EE
 
HTML5, CSS3 e o futuro da web
HTML5, CSS3 e o futuro da webHTML5, CSS3 e o futuro da web
HTML5, CSS3 e o futuro da web
 
Sql injection
Sql injectionSql injection
Sql injection
 
Explorando mecanismos autenticacao na web
Explorando mecanismos autenticacao na webExplorando mecanismos autenticacao na web
Explorando mecanismos autenticacao na web
 
Blockchain além do Hello World
Blockchain além do Hello WorldBlockchain além do Hello World
Blockchain além do Hello World
 
Aplicações stateless com PHP e JWT
Aplicações stateless com PHP e JWTAplicações stateless com PHP e JWT
Aplicações stateless com PHP e JWT
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
Manipulando JWT em apis Laravel
Manipulando JWT em apis LaravelManipulando JWT em apis Laravel
Manipulando JWT em apis Laravel
 
Ajax
AjaxAjax
Ajax
 
Segurança no desenvolvimento web
Segurança no desenvolvimento webSegurança no desenvolvimento web
Segurança no desenvolvimento web
 
Como quebrar criptografia xml
Como quebrar criptografia xmlComo quebrar criptografia xml
Como quebrar criptografia xml
 
Java e XML
Java e XMLJava e XML
Java e XML
 

Introdução ao JWT com Apache Oltu

  • 1. Neste post vou explicar um pouco sobre o funcionamento do JWT, como ele segue a especificação RFC 7519 é necessário usar alguma implementação e para este post vou usar apache oltu que é uma implementação da apache. Existem outras diversas implementações como a do Spring e etc. | Introdução JSON Web Token (JWT) é um padrão aberto baseado na ( RFC 7519 ) que define uma estrutura compacta para tráfego de dados úteis e com segurança nas permissões entre partes interessadas, estes dados são validados e são assinados digitalmente, podemos assinar um JWT usando um secret com o algoritmo HMAC ou usando par de chaves público-privadas usando RSA. Por ser compacto ele e rápido e pode ser enviado pela através da URL, por parâmetro ou dentro de um header HTTP. O token JWT carrega dados que serão úteis para a aplicação. O JWT se encaixa perfeitamente em dois cenários, autenticações ou na troca de informação, o uso mais comum hoje e em autenticações e ainda mais que hoje temos a grande popularidade das aplicações single page o JWT e uma ótima solução, o fluxo mais comum e ao realizar o login na aplicação receber no retorno o token JWT que será armazenado no localstorage e a cada nova requisição feita ao backend será passado o Authorization: Bearer <token> no cabeçalho HTTP que foi armazenado anteriormente no Localstorage , quando o backend receber o token fará a validação do token conferindo sua autenticidade, em caso de válido o recurso é liberado, caso não retorna erro HTTP 403. No decorrer do post vou detalhar melhor o uso e estrutura do JWT.
  • 2. | Estrutura JSON Web Token contém 3 partes:  Header  Payload  Signature O JWT geralmente fica da seguinte forma: header.payload.signature As partes são divididas por (.), a seguir vamos detalhar cada uma das partes. | Header A primeira parte da estrutura do JWT é o header que contém as informações sobre qual criptografia está sendo usada, podemos ver um exemplo logo abaixo, o typ representa o tipo que e JWT e o alg representa o algoritmo que está sendo usado, podemos usar algoritmos HMAC SHA ou RSA e cty e o content-type. Atributos do header: typ (Tipo do token) alg (Define o algoritmo usado) cty (Define content-type) { "typ": "JWT", "alg": "HS256", "cty": "text/html" }
  • 3. | Tipos de algoritmos Tipo Algoritmo Descrição HS256 HMAC using SHA-256 HS384 HMAC using SHA-384 HS512 HMAC using SHA-512 RS256 RSASSA-PKCS1-v1_5 using SHA-256 RS384 RSASSA-PKCS1-v1_5 using SHA-384 RS512 RSASSA-PKCS1-v1_5 using SHA-512 ES256 ECDSA using P-256 and SHA-256 ES384 ECDSA using P-384 and SHA-384 ES512 ECDSA using P-521 and SHA-512 PS256 RSASSA-PSS using SHA-256 and MGF1 with SHA-256 PS384 RSASSA-PSS using SHA-384 and MGF1 with SHA-384 PS512 RSASSA-PSS using SHA-512 and MGF1 with SHA-512 | Payload (Claims) Claims reservados Essas são as claims definidas pela especificação IANA JSON Web Token Claims estas claims já são pré-definidas, não são obrigatórias (Mas recomendadas), são um conjunto de informações úteis e interoperáveis podendo ser utilizados por protocolos de segurança em várias APIs.
  • 4. lista de claims pré-definidas abaixo: Nome Descrição Claim iss Issuer(Quem emitiu o token) sub Subject(Quempertence o token, geralmente id do usuário) aud Audience(identifica os destinatários para os quais o JWT se destina) exp Expiration Time(Timestamp quando expira) nbf Not Before(Timestamp a partir de quando o token pode ser usado) iat Issued At(Timestamp quando foi emitido o token) jti JWT ID (identificador único do token.) Exemplo de payload: { "sub": "33743568", "name": "Rodrigo araújo", "admin": true, .... }
  • 5. Claims públicos São atributos que definem o uso do JWT e informações úteis para a aplicação o ideal é usar identificadores diferentes para evitar colisões, uma vez que são claims públicas o ideal é fazer o uso de URI ou URL para reduzir a possibilidade de colisões. { "http://www.site.com.br/admin": "true" } Claims privados Assim como os claims públicos os privados também necessitam de evitar colisões.Tanto os claims públicos quanto os privados devem ser usados com moderação para manter o token o menor possível usando apenas informações necessárias. Podemos usar com id de usuário ou qualquer outro dado,sempre opte por nomes curtos para manter os JWT compactos. | Signature A signature e composta por header e payload convertidos para base64 e mais o secret. No exemplo abaixo a signature foi criado usando SHA256 HMAC. String secret = “txt_secreto”; String header = base64(header); String payload = base64(payload); String signature = HMACSHA256(header+"."+payload , secret); String token = header+"."+payload+"."+signature;
  • 6. Print do token JWT: Agora vamos fazer uma demonstração da criação e validação do JWT e para isso vamos usar o apache Oltu que e uma implementação do JWT (RFC 7519). | Dependências Oltu eyJhbGciOiJTSEEyNTYiLCJ0eXAiOiJKV1QifQ .eyJhdWQiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvdG9rZW4 iLCJpc3MiOiI3ODg3MzIzNzIwNzgtcGFzNmM0dHF0dWRwb2NvMmY0YXUxOGUwM HN1ZWRqdGJAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJleHAiOjE0O TUzMzYzNDQsImlhdCI6MTQ5NTMzMjc0NCwic2NvcGUiOiIgaHR0cHM6Ly93d3cuZ2 9vZ2xlYXBpcy5jb20vYXV0aC9wbHVzLmxvZ2luIn0 .9kt1zMrD5XK57KVNLQRy_3h2vpz7Pm7nVt7M4hgcfdE <!-- https://mvnrepository.com/artifact/org.apache.oltu.oauth2/org.apache.oltu.oaut h2.jwt --> <dependency> <groupId>org.apache.oltu.oauth2</groupId> <artifactId>org.apache.oltu.oauth2.jwt</artifactId> <version>1.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.oltu.jose/org.apache.oltu.jose.jws --> <dependency> <groupId>org.apache.oltu.jose</groupId> <artifactId>org.apache.oltu.jose.jws</artifactId> <version>1.0.0</version> </dependency>
  • 7. | Exemplo JWT //chave que é usada na assinatura String pk = "nomeSecreat"; // Classe que possui métodos de criação de signature e validação. SignatureMethodsHMAC256Impl sHmacImpl = new SignatureMethodsHMAC256Impl(); // classe que recebe o array de bytes do secret para gerar signature SymmetricKeyImpl key = new SymmetricKeyImpl(pk.getBytes()); //Criar estrutura jwt JWT jwt = new JWT.Builder() .setHeaderType(TipoTyp.JWT.getValor()) . .setHeaderAlgorithm(TipoAlgoritimo.SHA256.getValor()) .setClaimsSetIssuer("https://api.site.com") .setClaimsSetSubject("33743568") .setClaimsSetAudience("https://accounts.site.com/o/oauth2/token") .setClaimsSetExpirationTime(System.currentTimeMillis() / 1000 +3600) .setClaimsSetIssuedAt(System.currentTimeMillis() / 1000) .setClaimsSetJwdId("id_87594353") .setClaimsSetCustomField("nome","Rodrigo Araújo") .setClaimsSetCustomField("admin",true) .build(); String header = new JWTHeaderWriter().write(jwt.getHeader()); String payload = new JWTClaimsSetWriter().write(jwt.getClaimsSet()); System.out.println(jwt.getHeader()); /* Imprime: {typ: JWT, alg: SHA256,cty:null} */ System.out.println(header); /* O JWTHeaderWriter().write validar se tem algum atributo nulo */ /* Imprime: {alg:SHA256,typ:JWT} */
  • 8. public static void main(String[] args) { System.out.println(jwt.getClaimsSet()); /* Imprime: {iss: https://api.site.com, sub: 33743568, aud: https://accounts.google.com/o/oauth2/token, exp: 1495383435, nbf: null, iat: 1495379835, jti: id_87594353, typ: null } */ System.out.println(payload); /* O JWTClaimsSetWriter().write validar se tem algum atributo nulo */ /* Imprime: {aud:"https://accounts.google.com/o/oauth2/token", iss:"https://api.site.com", jti:"id_87594353", sub:"33743568", exp:1495383435, iat:1495379835, admin:true} */ //converte header e payload em base64 JWTReader jheader = new JWTReader(); header = jheader.base64Encode(header); payload = jheader.base64Encode(payload); //cria a signature usando SHA256 String signature = sHmacImpl.calculate(header, payload, key); System.out.println(signature ); //Imprime a signature - qMwn57yT1g9azJF-zDatMliElq-rdFNgkuB1gTQwfLY String token = header+"."+payload+"."+signature; System.out.println(token); /* Imprime o token JWT : eyJhbGciOiJTSEEyNTYiLCJ0eXAiOiJKV1QifQ .eyJhdWQiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvd G9rZW4iLCJpc3MiOiJodHRwczovL2FwaS5zaXRlLmNvbSIsImp0aSI6ImlkXzg3 NTk0MzUzIiwic3ViIjoiMzM3NDM1NjgiLCJleHAiOjE0OTUzODQ1MzksImlhdCI6 MTQ5NTM4MDkzOSwiYWRtaW4iOnRydWV9 .qMwn57yT1g9azJF-zDatMliElq-rdFNgkuB1gTQwfLY O token pode ser enviado para o browser... */ }
  • 9. A imagem abaixo reflete muito bem o fluxo, na primeira ação a aplicação faz login mandando um POST com usuário e senha, ao se confirmar as credenciais enviadas será criado o token JWT que é retornado para o browser armazená-lo e a cada nova requisição que for realizada o token será passado no header Authorization: Bearer<token> O último fluxo vai checar a autenticidade do token JWT onde a aplicação checar o token com a secret e fará a validação, caso seja um token válido o recurso é liberado. Boolean autentico = sHmacImpl.verify(signature, header, payload, key); if(autentico){ System.out.println("Token válido"); } else { System.out.println("Token inválido"); }
  • 10. Este é um primeiro post sobre JWT mais fazendo uma breve explanação, os próximos posts serão mais práticos e os próximos serão: 1 - Usar a autenticação com JWT e angular; 1.x 2 - Autenticações com OAuth2 - Implementação do apache Oltu:  OAuth 2.0 Authorization Server  OAuth 2.0 Client  OAuth 2.0 Resource Server  OAuth 2 server to server 3 - Autenticações com OAuth2 e angular 1.x Ate à próxima... REFERÊNCIAS https://tools.ietf.org/html/rfc7519 https://jwt.io https://oltu.apache.org/