JWT & Laravel 5

Escrito por Jesus Arriaga B.

26 de septiembre de 2016

Json Web Token o JWT es un standard abierto que define como transmitir datos seguros de manera compacta y auto contenida entre servidores o servicios mediante el uso de JSON (RFC 7519), la información contenida en un JWT es confiable y verificada gracias a que esta firmada digitalmente, el JWT puede ser firmado mediante una llave secreta (secret key) haciendo uso del algoritmo HMAC o también puede ser firmada mediante llaves RSA.

La razón principal de usar JWT es para realizar sistemas de autenticación, hoy en día la mayor parte de aplicaciones SPA (single page application) y las aplicaciones mobiles (APPS) depende de una API (application program interface) debido a la naturaleza de los API estos no guardan estados o sesiones (stateless), además de otros sistemas de autenticación mas propensos a ser vulnerados como el AUTH BASIC, es muy bueno implementar JWT’s ya que nos brindan una manera fácil de validar y autenticar usuarios con nuestras API’s brindando una mayor seguridad y confiabilidad.

Laravel será nuestra herramienta de batalla en este pequeño tutorial de implementación de JWT’s con Laravel en PHP.

Manos a la obra

El primer paso es instalar el paquete de Tymon JWT para Laravel, puede ver el manual de instalación en la siguiente url https://github.com/tymondesigns/jwt-auth/wiki/Installation

  • Para instalar el paquete debes editar el archivo composer.json de tu instalación de Laravel y agregar el siguiente paquete.
"require": {
"tymon/jwt-auth": "0.5.*"
}

y correr el comando composer update para actualizar tus paquetes.

  • Agregar los aliases para tu archivo de configuración app.php
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth',
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
  • Una vez agregados los aliases, el siguiente paso es publicar el service provider usando el comando artisan de Laravel
$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
  • Para finalizar debes generar la llave secreta para tu jwt
$ php artisan jwt:generate

Con estos pasos ya tienes implementado las clases para el uso de JWT , ahora debes verificar que tengas el middleware the JWT definidos en el archivo \app\Http\Kernel.php , en caso contrario solo agrega las lineas al final de archivo

protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,


];

Ahora ya puedes proteger tus rutas privadas con JWT token, puedes usar el middleware jwt.auth

Route::group(['middleware' => 'jwt.auth'],function(){  
//tus rutas seguras
});

Ahora para generar un JWT token mediante tu API debes usar el siguiente método, JWTAuth::attempt este método recibe como parámetros el email y contraseña y automáticamente verifica las credenciales con tu modelo o clase \User y si las credenciales son correctas entonces te regresa un token que debes proporcionarlo como response a tu cliente.

$token = JWTAuth::attempt($credentials)

Este es un ejemplo del “login” de una API que recibe email y password y regresa el JWT token, este token debe ser usado para poder procesar todas las request de tus rutas seguras.

public function loginEmail(Request $request)
{
$credentials = $request->only('email','password');

//Validate parameters
$validator = Validator::make($credentials, [
'email' => 'required|email|max:255',
'password' => 'required|min:6',
]);

//Check if validation fails
if($validator->fails()){
return response()->json(['error'=>$validator->errors()],Response::HTTP_BAD_REQUEST);
}
try {
// attempt to verify the credentials and create a token for the user
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'The email or password you entered is incorrect'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['error' => 'could_not_create_token'], 500);
}
// all good so return the token
return response()->json(compact('token'));
}

ahora para poder usar tu token en tus requests debes agregar un header a tu request que se llame Authorization y como valor debes agregar la palabra Bearer seguido por el token y listo, ya tienes aplicado tu JWT token, tus rutas seguras automáticamente validarán el JWT token proporcionado en tu request y aprobarán o denegarán el acceso a tu ruta, recuerda que tu token tiene expiración pero puedes refrescarlo cuando tu desees, si quieres mas información acerca de otros métodos que usa JWT puedes visitar estos links

JWT.IO

https://github.com/tymondesigns/jwt-auth/wiki

llamada de API con jwt token — postman

JWT & Laravel 5 was originally published in 200 Response on Medium, where people are continuing the conversation by highlighting and responding to this story.