Autenticação JWT com CakePHP 3
Com o crescimento de desenvolvimento de serviços rest, veio também a necessidade de segurança no momento de trafegar os dados em requests e responses, uma forma de autenticação bastante utilizada é JWT(JSON Web Token). Nesta publicação vou mostrar como incluir um middleware de autenticação utilizando um plugin para cakephp.
Partindo do princípio onde já se tem todo “esqueleto” de um projeto cakephp (https://book.cakephp.org/3.0/en/installation.html) vamos incluir o plugin (https://github.com/ADmad/cakephp-jwt-auth), acessando a url anterior e executando todos os passos para instalação, nosso projeto estará com o plugin configurado.
Para inserir a autenticação, partindo do princípio que nosso cenário possui serviço de login, devolveremos um token de autenticação após a efetivação do login.
Em nosso AppController inserimos o seguinte código no método initialize:
Notamos que no “authenticate” é incluído duas formas de autenticação uma por “Form” e outra utilizando o “ADmad/JwtAuth.Jwt”
No “Form” passamos os campos necessários para o login e a tabela que será utilizada para buscar os dados e no “ADmad/JwtAuth.Jwt” passamos uma condição no “scope ” e o campo “fields” base que será utilizado para criar o token.
Partindo do princípio que temos um UsuariosController e o mesmo possui o método login, iremos fazer a “devolução” de um token após o sucesso do login conforme código abaixo:
No código acima é realizado a autenticação do usuario, por meio de form onde sera passado “login” e “senha”. Caso retorne sucesso a aplicação ira gerar o token, onde “sub” sera o campo a partir do qual ira ser gerado o token e “exp” o prazo de expiração em segundos.
Executando o login em uma aplicação que nos auxilia a mandar requests como o postman utilizado no exemplo, notamos o seguinte.
Agora podemos pegar o token e fazer requisições para quaisquer métodos como seguinte:
curl -X GET \
http://localhost:8765/api/usuarios/4 \
-H 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJndWkiLCJleHAiOjE1MTE2MDQzODl9.MsZfCn1n9KC4wFol1AaNiTAu7VMU69x38Gw0sFG4xJQ' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: e17d140d-d217-3d9c-03a4-b87c795da500'
Nota-se que deve ser passado um headers authorization e o valor deve ser Bearer TOKEN onde o token é o jwt retornado do login.
Caso o método possa ser acessado sem necessidade de autenticação, deve ser passado o seguinte no método initialize() do seu respectivo controller:
$this->Auth->allow([‘login’]);
Passando isso estamos dizendo para nossa aplicação que o método login da classe em questão não necessita de autenticação para realizar requisições.
Repositório com JWT-CAKEPHP: https://github.com/guil95/JWT-CAKEPHP. Acessar pasta /api subir servidor “php bin/cake.php server” e executar os testes em /v1 por exemplo http://localhost:8765/v1/usuarios/login. Criar banco de dados com a tabela usuarios contendo os campos login e senha. o método login retornará o token o qual poderá ser usado para buscar os usuarios no endpoint /v1/usuarios.
Espero ter ajudado, qualquer dúvida entre em contato em:
https://guil95.github.io/curriculo