Modelo simplificado de atenticação através de jwt utilizando o framework Laravel (versão 5.2) e jwt-auth por Sean Tymon (versão 0.5.9).
laravel new laravel-jwt-auth
composer require tymon/jwt-auth
No arquivo ./config/app.php:
'Tymon\JWTAuth\Providers\JWTAuthServiceProvider'
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
php artisan jwt:generate
Ao gerar a chave de segurança do jwt, que fica armazenada no arquivo ./config/jwt.php sugerimos que seja colocado no arquivo .env.
php artisan make:auth
Crie um banco de dados para teste e configure o aquivo .env e faça a migração das tabelas usuários.
php artisan migrate
php artisan make:controller AuthenticateController
Neste controller deve estar mais ou menos assim, conforme sua demanda:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class AuthenticateController extends Controller
{
public function authenticate(Request $request)
{
// Buscar credenciais através da variável Request
$credentials = $request->only('email', 'password');
try {
// Há várias formas de gerar o token
//
// 1. Utilizando as credenciais de um usuário
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['error' => 'could_not_create_token'], 500);
}
// 2. Utilizando o objeto $user (modelo User)
// $user = User::first();
// $token = JWTAuth::fromUser($user);
// 3. Utilizanr qualquer informação que deseje
// $customClaims = ['foo' => 'bar', 'baz' => 'bob'];
// $payload = JWTFactory::make($customClaims);
// $token = JWTAuth::encode($payload);
// Retorna o token se estiver ok
return response()->json(compact('token'));
}
public function getAuthenticatedUser()
{
try {
if (! $user = JWTAuth::parseToken()->authenticate()) {
return response()->json(['user_not_found'], 404);
}
} catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
return response()->json(['token_expired'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
return response()->json(['token_invalid'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['token_absent'], $e->getStatusCode());
}
// the token is valid and we have found the user via the sub claim
return response()->json(compact('user'));
}
}
No arquivo ./app/Http/Kernel.php:
protected $routeMiddleware = [
...
'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken',
'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken',
];
No arquivo app/Exceptions/Handler.php, função render
:
if ($e instanceof Tymon\JWTAuth\Exceptions\TokenExpiredException) {
return response()->json(['token_expired'], $e->getStatusCode());
} else if ($e instanceof Tymon\JWTAuth\Exceptions\TokenInvalidException) {
return response()->json(['token_invalid'], $e->getStatusCode());
}
return parent::render($request, $e);
No arquivo ./app/Http/routes.php insira as rotas abaixo:
Route::post('api/auth', 'AuthenticateController@authenticate');
Route::get('getUser', 'AuthenticateController@getAuthenticatedUser');
Route::group(['prefix' => 'api', 'middleware' => 'jwt.auth'], function()
{
// Todas as rotas aqui já deverão ter sido autenticadas!
Route::get('user', function()
{
return 'Autenticado!';
});
});
Exemplo: - email: john.doe@domain.com - senha: teste123
Teste suas funções de criação de token com o PostMan, sendo:
Como o Laravel possui uma camada de segurança utilizando token CSRF para sessões, será necessário buscar esse token para fazer nossa validação via jwt.
- Acesse a página: http://localhost:8000/login, vá ao código fonte (Ctrl+U no Chrome).
- Localize a palavra token, será um input do tipo hidden, e copie seu valor (value);
- Método: POST
- URL: http://localhost:8000/api/auth
- Body:
- email: john.doe@domain.com (email do seu usuário criado no item 5)
- password: teste123 (senha de seu usuário criado no item 5)
- Headers:
- X-CSRF-TOKEN: Aqui será colocado seu CSRF-TOKEN(item 6.1)
- Clique em Send, seu resultado será o seu token(jwt-token)!
- Método: GET
- URL: http://localhost:8000/getUser
- Headers:
- Authorization: Bearer {seu jwt-token} É, tem de usar a key "Authorization" e no campo value exatamente como acima: "Bearer {seu jwt-token}"!
Pronto!
Verá que está validando! Teste retirar o token e veja que causará uma exceção.
Verifique as rotas dentro do middleware group e verá que funciona.
Modelos utilizados no PostMan (Collections) estão em json v2 em ./storage/postman.
Este model está sob a licença MIT license, tanto o Laravel e jwt-auth também possuem a mesma licença.