Api criada em Laravel na versão 8, Docker para infraestrutura e MySql como banco de dados, utilizando a biblioteca tymon/jwt-auth.
Nesse projeto foi criada uma Model customizada para autenticação (no padrão da biblioteca, a Model User é utilizada como padrão ) e uma Middleware para tratar as exceptions e então padronizar o retorno das respostas das requisições.
git clone https://github.com/WenLopes/laravel8-jwt
Na raiz do projeto, crie o arquivo .env do DOCKER utilizando o arquivo .env.example como base. Modifique o valor das variáveis de acordo com a sua preferência.
cp .env_example .env
(Opcional) Se desejar, altere as portas padrão da aplicação no arquivo .env
docker-compose up --build
4.1 Instale as dependências do Laravel executando o comando na raiz do projeto:
docker-compose exec php7_base composer install
4.2 Corriga as permissões dos diretórios, executando os comandos abaixo no diretório api:
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
4.3 Crie o arquivo .env do diretório api, utilizando o .env.example como base:
cp .env_example .env
(Opcional) Se desejar, altere o email e senha padrão do funcionário que irá representar nosso usuário do banco de dados
4.4 Gere a chave do projeto executando o comando na raiz do projeto:
docker-compose exec php7_base php artisan key:generate
4.5 Gere a chave do JWT executando o comando na raiz do projeto:
docker-compose exec php7_base php artisan jwt:secret
4.6 Rode as migrations e Seeders executando o comando na raiz do projeto:
docker-compose exec php7_base php artisan migrate:refresh --seed
O arquivo config/jwt.php na api possui a índice ttl (representa em minutos o tempo de vida útil do token) definido como 1. Dessa forma, após gerar um token pela rota de login, o mesmo vai durar 60 segundos até que expire.
Mantendo essa configuração, será possível realizar o teste de resposta com token atualizado que nossa Middleware está provendo.
Para execução de mais testes, execute um dos passos abaixo:
-
Envie uma requisição para alguma rota protegida SEM TOKEN informado
-
Envio uma requisição para alguma rota protegida COM TOKEN INVÁLIDO informado.
-
Envio uma requisição para alguma rota protegida COM TOKEN EXPIRADO informado.
-
Envio uma requisição para alguma rota protegida COM ERRO DESCONHECIDO retornado pela Middleware (para isso, uma excepion proposital pode ser lançada na Middleware AuthJwt para visualizar o erro).
Para mapeamento de novas exceptions, basta criar uma nova classe que implemente a interface IExceptionResponse e inserir na constante EXCEPTIONS do serviço AuthExceptionService, contendo qual a exception a ser MAPEADA e qual a classe RESPONSÁVEL pelo retorno.
Na raiz do projeto, execute o comando:
docker-compose exec php7_base vendor/bin/phpunit