Palestra apresentada na trilha de Arquitetura PHP do TDC São Paulo 2018.
Size: 1.34 MB
Language: pt
Added: Jul 21, 2018
Slides: 54 pages
Slide Content
Manipulando JWT em
apis Laravel
EDUARDO CESAR
DESENVOLVEDOR DE SOFTWARE
ZARPSYSTEM
Authentication
Authentication is the process of
verification that an individual, entity or
website is who it claims to be.
OWASP
Authorization
...generally enforced on the basis of a
user-specific policy, and authentication
is the way to establish the user in
question.
OWASP
Processos para
autenticação
Básicamente duas formas!
●Autenticação baseada em sessões
e cookies
●Autenticação baseada em tokens
Respostas
HTTP
Sempre condizentes com as
ações
●200 Para casos de sucesso,
●400 Para casos de erros, como
email inválido por exemplo
●404 Para usuários não encontrado
●401 Para usuários não autorizados
●403 Para acesso proíbido
JWT
Json Web Token
É uma especificação descrita na RFC
7915, e propõe uma implementação
segura para troca de informações entre
client e server através de objetos json.
Como JWT trabalha ?
O que constitui um
token JWT ?
JWT
Anatomia
●HEADER
●PAYLOAD
●SIGNATURE
Header ?
HEADERS
PAYLOAD ?
PAYLOAD
{
// registered claims
"iss": "a partir de onde o token foi gerado",
"iat": “identifica a hora que foi gerado representada por um timestamp”,
"exp": “define um timestamp de expiração para o token ”,
"nbf": “define um timestamp para que o token não seja processado antes
dele”,
"jti": "é o identificador único deste token JWT ID",
"sub": 1,
// public claims
"prv": "o hash da class User Provider do Laravel",
"role": "uma permissão definida pela aplicação"
}
SIGNATURE ?
SIGNATURE
Somente o dono da chave secreta poderá alterar
informações contidas no token.
JWT
Considerações em torno de
segurança
●Sempre defina um algoritmo de criptografia no
header, nunca algo do tipo {‘alg’ :’ none’}.
●Situações que exigem mais cuidados considere o
uso de chaves públicas/privadas para assinatura.
●Maior segurança contra ataques do tipo ‘Man in
the middle’.
●Defina um tempo de expiração para o token que
seja aceitável para sua aplicação.
●Utilize técnicas de refresh e invalidate para os
tokens.
Implementando no
Laravel
Laravel JWT-AUTH
Pré requerimentos
Laravel 5.5.*
Jwt-auth 1.0.0-rc.1
Base de dados mysql/postgress ou outro
Instalação
composer create-project --prefer-dist laravel/laravel=5.5.* jwt-auth
composer require tymon/jwt-auth:1.0.0-rc.1
Laravel JWT-AUTH
Adicionar provider e aliases
Inserir os providers e aliases no arquivo app.php, localizado no diretório
/config
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Laravel JWT-AUTH
Publish
php artisan vendor:publish
--provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Este comando irá gerar o arquivo jwt.php, localizado no diretório
/config
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Laravel JWT-AUTH
Generate JWT Secret
php artisan jwt:secret
Este comando irá gerar uma chave secreta que será utilizada no processo
de encriptação do tokenovider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Laravel JWT-AUTH
Configurando o arquivo config/auth.php
Os ajustes nesse arquivo se referem ao mecanismo de autenticação, e a
entidade de banco de dados utilizada para verificação de dados.
Laravel JWT-AUTH
Laravel JWT-AUTH
Criar model user e sua migration
php artisan make:model Domain/Admin/User --migration
Altere a estrutura da migration, para uma estrutura contendo nome,
email,
e senha. Em seguida devemos alterar a model que foi criada.
Laravel JWT-AUTH
Ajuste o model para poder usar JWT
Laravel JWT-AUTH
Adicionando middlewares default da biblioteca
Laravel JWT-AUTH
App/Http/Kernel.php
Laravel JWT-AUTH
Adicionando rotas em routes/api.php
Laravel JWT-AUTH
routes/api.php
Testando a geração de
token
Testando acesso com
o token
Manipulando JWT
Laravel JWT-AUTH
Configurando claims, e tempo de expiração
$token = auth()->guard(‘api’)
->claims(['role' => 'user'])
->setTTL(1800)
->attempt($credentials);
Cria um token adicionando a claim de role, e o tempo de expiração
baseado em segundos.
san vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Laravel JWT-AUTH
Mais métodos...
auth()->logout(true);
$newToken = auth()->refresh(true, true);
auth()->invalidate(true);
auth()->payload();
san vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"