Upload
bruno-neves-menezes
View
129
Download
21
Embed Size (px)
Citation preview
stateless?
statelesstodo request é como se fosse a primeira vez
statelessa aplicação não mantém informações sobre a sessão ativa
statelesso request contém todas as informações necessárias para ser compreendido e processado
statelessquem mantém o estado é o cliente
vantagens
vantagensescalabilidade horizontal
vantagensmenor utilização de recursos computacionais
vantagensarquitetura com design simplificado
vantagensmicroservices friendly
como?
JSON Web Token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9waHAtand0IiwiYXVkIjoiaHR0cDpcL1wvd3d3LnBocGRmLm9yZy5iclwvIiwianRpIjoiZWRjOWIwMWYtNjE4YS00YTMyLTkyZGYtZGRlMWM0YmRlMDA0IiwiaWF0IjoxNDkxOTY3MzU4LCJuYmYiOjE0OTE5Njc0MTgsImV4cCI6MTQ5MTk3MDk1OCwibmFtZSI6IkJydW5vIE5ldmVzIiwiZW1haWwiOiJicnVub25tQGdtYWlsLmNvbSJ9.O_jGNRVc7STUknGBavZi-dFqYLDkrt9LAB3zOCYRR_8
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9waHAtand0IiwiYXVkIjoiaHR0cDpcL1wvd3d3LnBocGRmLm9yZy5iclwvIiwianRpIjoiZWRjOWIwMWYtNjE4YS00YTMyLTkyZGYtZGRlMWM0YmRlMDA0IiwiaWF0IjoxNDkxOTY3MzU4LCJuYmYiOjE0OTE5Njc0MTgsImV4cCI6MTQ5MTk3MDk1OCwibmFtZSI6IkJydW5vIE5ldmVzIiwiZW1haWwiOiJicnVub25tQGdtYWlsLmNvbSJ9.O_jGNRVc7STUknGBavZi-dFqYLDkrt9LAB3zOCYRR_8
header
payload
signature
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9waHAtand0IiwiYXVkIjoiaHR0cDpcL1wvd3d3LnBocGRmLm9yZy5iclwvIiwianRpIjoiZWRjOWIwMWYtNjE4YS00YTMyLTkyZGYtZGRlMWM0YmRlMDA0IiwiaWF0IjoxNDkxOTY3MzU4LCJuYmYiOjE0OTE5Njc0MTgsImV4cCI6MTQ5MTk3MDk1OCwibmFtZSI6IkJydW5vIE5ldmVzIiwiZW1haWwiOiJicnVub25tQGdtYWlsLmNvbSJ9.O_jGNRVc7STUknGBavZi-dFqYLDkrt9LAB3zOCYRR_8
header
payload
signature
base64 “url-safe”
{
"typ": "JWT",
"alg": "HS256"
}
header
payload{
"iss": "http://php-jwt",
"aud": "http://www.phpdf.org.br/",
"jti": "edc9b01f-618a-4a32-92df-dde1c4bde004",
"iat": 1491967358,
"nbf": 1491967418,
"exp": 1491970958,
"name": "Bruno Neves",
"email": "[email protected]"
}
signaturebase64UrlEncode(
hash_hmac(
'sha256',
base64UrlEncode($headerJson) . '.' . base64UrlEncode($payloadJson),
'xviphpfc',
true
)
);
signaturebase64UrlEncode(
hash_hmac(
'sha256',
base64UrlEncode($headerJson) . '.' . base64UrlEncode($payloadJson),
'xviphpfc',
true
)
);
JSON Web Signature - RFC 7515
claims
claimsreservados, públicos e privados
reservadosiss emissor (issuer)
sub objetivo (subject)
aud consumidor (audience)
exp expira em (expiration time)
nbf válido a partir de (not before)
iat criado em (issued at)
jti jwt id
todos opcionais
públicossão definidos de acordo com a necessidade
públicosdevem possuir uma padronização que evite a colisão de nomes
públicosdevem ser registrados na IANA
privadosassim como os públicos, são definidos de acordo com a necessidade estabelecida pelo emissor e consumidor
claims, the big pictureinclua as informações necessárias e respeite os claims reservados, para garantir a interoperabilidade do token
utilização
utilizaçãocabeçalho
GET / HTTP/1.1Host: localhostAuthentication: Bearer <token>
utilizaçãoquery string
http://siteseguro.com?bearer=<token>
utilizaçãoou dentro do POST, apesar de ser incomum
por que JWT?
por que JWT?compacto
por que JWT?self-contained
por que JWT?cross-domain
por que JWT?seguro
por que JWT?agnóstico de linguagem
cases
casesautenticação
casesesqueci minha senha
casessingle sign on
casesproteção CSRF
<?php
> composer require lcobucci/jwt
$token = (new Lcobucci\JWT\Builder())
->setIssuer('http://php-jwt')
->setAudience('http://www.phpdf.org.br/')
->setId(Ramsey\Uuid\Uuid::uuid4())
->setIssuedAt(time())
->setNotBefore(time() + 60)
->setExpiration(time() + 3600)
->set('name', 'Bruno Neves')
->set('email', '[email protected]')
->sign(new Lcobucci\JWT\Signer\Hmac\Sha256(), 'xviphpfc')
->getToken();
echo $token;
$token = (new Lcobucci\JWT\Parser())->parse($rawToken);
echo $token->getClaim('name'); // Bruno Neves
$validation = new Lcobucci\JWT\ValidationData();
$validation->setIssuer('http://php-jwt');
$validation->setCurrentTime(time() + 3601);
var_dump($token->validate($validation)); // falso, token expirado
https://github.com/lexik/LexikJWTAuthenticationBundle
https://github.com/tymondesigns/jwt-auth
segurança
segurançabase64 não é criptografia
segurançanão coloque nenhuma informação sensível no token
segurançaa assinatura permite garantir que o token não foi alterado, porém não impede a visualização dos claims
segurançautilize um algoritmo de criptografia recomendado (hmac sha256, rsa256…)https://tools.ietf.org/html/rfc7519#section-8
segurançasempre que o algoritmo for "none", se certifique que o token não contém assinatura antes de processar
segurançaverifique a situação da biblioteca no http://jwt.io
FAQ
logoutapague o token no cliente
invalidaçãoblacklist de tokens válidos (não-expirados) pelo "jti"
dúvidas?
obrigado!
referênciashttps://tools.ietf.org/html/rfc7519https://jwt.iohttps://slideshare.net/lcobucci/jwt-to-authentication-and-beyondhttps://slideshare.net/ivanrosolen/autenticao-com-json-web-token-jwt
imagenshttp://nyandabout.com/wp-content/uploads/2016/02/Como-se-fosse-a-primeira-vez.jpghttps://conteudo.imguol.com.br/c/entretenimento/9c/2017/04/06/reproducao-de-uma-pagina-do-manual-do-escoteiro-mirim-com-o-codigo-secreto-marciano-1491480332132_v2_750x421.jpgxhttps://cdn.auth0.com/content/jwt/jwt-diagram.pnghttp://docplayer.com.br/docs-images/24/2864128/images/11-0.png