Autenticación (login y registro) con Lumen

Si estás aquí significa que la documentación de Lumen, no te está diciendo que es lo que tienes que hacer para usar la autenticación sin problemas. Vamos a aprender a crear un login y un registro para nuestra API

Configuración básica

Por si aun no lo sabes Lumen, viene con configuraciones deshabilitadas, habilitaremos las que necesitemos para este caso.

Abrimos nuestro archivo bootstrap/app.php y vamos a descomentar las lineas que tengan lo siguiente:

$app->withEloquent();

Para poder tener el servicio de Eloquent

$app->withFacades();

Esto lo que hace es aplicar las clases que vienen el laravel, como por ejemplo Crypt, Validator, etc.

$app->routeMiddleware([
  'auth' => App\Http\Middleware\Authenticate::class,
]);

Y el middleware que intercepta las peticiones a nuestra API

$app->register(App\Providers\AuthServiceProvider::class);

Este, añade el proveedor de autenticación al proyecto

Vamos a ir a nuestro archivo app/Providers/AuthServiceProvider.php y nos vamos a fijar en el siguiente código:

if ($request->input('api_token')) {
  return User::where('api_token', $request->input('api_token'))->first();
}

Este proveedor se ejecuta con el middleware, y básicamente valida que esté recibiendo un token, y que el token sea del usuario logueado. ¿Cómo creamos ese token? Ya lo vamos a ver más adelante.

Creando la migración de usuarios

Ejecutamos el siguiente comando para crear la migración:

php artisan make:migration create_users_table --create=users

Nuestro Schema debería quedar mas o menos de la siguiente manera:

Schema::create('users', function (Blueprint $table) {
  $table->increments('id');
  $table->string('name');
  $table->string('email')->unique();
  $table->string('password');
  $table->timestamps();
  // api_token es donde se va a guardar el token del usuario al loguear
  $table->string('api_token')->unique()->nullable();
});

Ejecutamos la migración con el siguiente comando

php artisan migrate

No olvidemos modificar el modelo User.php

protected $fillable = [
  'name', 'email', 'password', 'create_at', 'update_at', 'api_token'
];

Creando el controlador de login

Lamentablemente, lumen no cuenta con el comando artisan para crear controladores, por lo que debemos replicar el archivo ExampleController.php y cambiarle el nombre a LoginController.php, debe quedar de la siguiene manera:

<?php
namespace App\Http\Controllers;
class LoginController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    //
}

Creamos el metodo login, debería quedar asi:

public function login( Request $req ){
  // validacion del request	
  $this->validate( $data, [
    'email' => 'email|required',
    'password' => 'required'
  ]);
	
  // consulta del usuario
  $user = User::query()->where('email', $req->input('email') )->first();
	
  // verificaion de contraseña
  if( Crypt::decrypt( $user->password ) === $req->input('password') ){
		
    // creamos un string random para el token
    $api_token = str_random(50);
    
    // le seteamos el api_token al usuario
    $user->api_token = $token

    // guardamos
    $user->save()
		
    // retornamos el api_token, para futuras peticiones
    return response()->json(['status' => 'success','api_token' => $apikey]);
  }else{

    return response()->json(['status' => 'fail'],401);
  }

}

El logout, lo podemos aplicar aca mismo y quedaría algo así:

public function logout(Request $req){
  User::where('api_token', $req->input('api_token'))->update(['api_token' => null]);
  return response()->json(['status' => 'success']);
}

Creando el controlador Register

Para crear el controlador, el mismo proceso que con el del login. y nuestro método register, debería quedar así:

public function register( Request $req ){
  // validamos los datos
  $this->validate( $data, [
    'name' => 'required',
    'email' => 'email|required',
    'password' => 'required'
  ]);
  
  // ciframos el password
  $req->input('password') = Crypt::encrypt( $data['password'] );

  // creamos un nuevo usuario
  $user = User::create( $data );
  return response()->json(['status' => 'success', 'data' => $data]);
}

Creando las rutas de autenticación

nuestras rutas están en el archivo routes/web.php quedaría de la siguiente manera:

$router->post('login', 'LoginController@login');
$router->post('register', 'RegisterController@register');

// aplicamos el middleware auth
$router->group(['middleware' => 'auth'], function() use ($router){
  
  // aqui van todas las rutas que se necesitar estar autenticado para el acceso
  $router->post('logout', 'LoginController@logout');

});

Y con esto, ya tenemos nuestro sistema de login y registro en lumen para nuestra API.

Artículos que podrían gustarte