Aplicações stateless com PHP e JWT

Post on 21-Apr-2017

126 views 21 download

Transcript of Aplicações stateless com PHP e JWT

Aplicações stateless com PHP e JWT

Bruno Neves@brunodasneves

brunonm@gmail.comXVI PHP FC

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": "brunonm@gmail.com"

}

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', 'brunonm@gmail.com')

->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!

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