Laravel provee una estructura muy sólida a la hora de crear aplicaciones web, pero también ofrece todas las herramientas necesarias para crear API’s de forma muy sencilla. Uno de los temas más solicitados sobre el desarrollo de API’s con Laravel, es el sistema de autenticación basado en el uso de token. Un token es un valor único (digamos, una especie de clave) que se asigna a cada usuario que tiene acceso al sistema.
El sistema de autenticación basado en un «token» es un nuevo feature que ha sido incluido en Laravel 5.2 , veamos de que se trata siguiendo el siguiente ejemplo.
Lo primero que debemos hacer es configurar nuestra base de datos para crear algunos registros de prueba. Editamos el archivo .env para agregar las credenciales correspondientes.
DB_HOST=localhost DB_DATABASE=test DB_USERNAME=homestead DB_PASSWORD=secret
Debemos crear un nuevo campo (api_token) en la tabla users para almacenar el token de cada usuario. En database/migrations editamos la migración para la tabla users:
public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password', 60); $table->rememberToken(); $table->timestamps(); $table->string('api_token')->unique(); }); }
Editamos el archivo database/factories/ModelFactory.php para signar un valor aleatorio al campo api_token de cada usuario cuando sean creados con el seeder.
$factory->define(App\User::class, function (Faker\Generator $faker) { return [ 'name' => $faker->name, 'email' => $faker->email, 'password' => bcrypt(str_random(10)), 'remember_token' => str_random(10), 'api_token' => str_random(50) ]; });
y modificamos el método run de /database/seeds/DatabaseSeeder.php para poder generar un usuario:
public function run() { factory(App\User::class)->create(); }
Ahora solo nos queda ejecutar la migración desde la consola con:
php artisan migrate --seed
Cuando trabajamos con API’s no podemos loguear usuarios en sesión, en cambio podemos usar este tipo de verificación para autenticar el usuario y garantizar o denegar el acceso a la información.
Vamos a crear una ruta de prueba a la que solo puedan acceder usuarios debidamente autenticados, recuerda que esto lo haremos verificando el campo api_token en lugar del user y password como lo hacemos convencionalmente.
Primero, en el archivo config/auth.php podemos configurar el tipo de autenticación que deseamos usar por defecto, inicialmente tenemos disponibles «web» y «api».
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ],
En nuestro caso vamos a seleccionar api, para ello editamos el array defaults dentro del mismo archivo:
'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ],
Ahora creamos la ruta de prueba:
Route::group(['middleware' => ['auth:api']], function () { Route::get('test', function () { $user = \Auth::user(); return $user; }); });
Utilizamos el middleware auth, pasando como parámetro el sistema de autenticacion que deseamos usar auth:api
Ahora para cada request que realicemos debemos enviar el respectivo token de verificación, en este caso solo vamos a verificar que un usuario tenga el token que enviamos, si lo encuentra, devuelve la información de dicho usuario.
Para comprobar esto podemos simplemente hacer la peticion en el navegador, pero antes vamos a consultar los datos de algun usuario desde la consola para copiar la informacion del token. esto lo hacemos con
$ php artisan tinker $ App\User::first()
Obtendremos el siguiente un resultado parecido a este:
=> App\User {#639 id: 1, name: "Dr. Jevon Hintz DVM", email: "[email protected]", created_at: "2016-03-07 20:23:12", updated_at: "2016-03-07 20:23:12", api_token: "XeW3j3v3ZRe1KIe5DcOmzgE4MGPxK23Rk7pXhuCAqZTyBswSyk", }
Copiamos el token y accedemos desde el navegador a la ruta «test» enviando el token que obtuvimos anteriormente
styde.dev/test?api_token=XeW3j3v3ZRe1KIe5DcOmzgE4MGPxK23Rk7pXhuCAqZTyBswSyk
Y con esto veremos los datos del usuario al que pertenece el token enviado.
{ "id":1, "name":"Dudley Aufderhar", "email":"[email protected]", "created_at":"2016-03-07 20:50:31", "updated_at":"2016-03-07 20:50:31", "api_token":"LrRy1qMd2EBZkTUDNA7KfGZ89sgITGC8njhvqozGP9mGurSLrP" }
Este es un ejemplo muy sencillo sobre cómo configurar el sistema de autenticación por medio de token, para definir las restricciones y permisos de cada usuario podemos usar «gates» pero este tema será tratado en otras lecciones.
Espero que te haya gustado este tutorial, no olvides dejar tus comentarios y compartir este contenido con tus colegas en redes sociales.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.