Crea una API Rest con Autenticaci贸n 馃攼 Laravel y Passport

Tiempo de lectura: 3.62 minutos

P贸ster del art铆culo Crea una API Rest con Autenticaci贸n 馃攼 Laravel y Passport

Hoy vamos a desarrollar una API Rest usando Laravel y Passport.

La configuraci贸n es m谩s sencilla de lo que parece.

S贸lo ten en cuenta que para seguir esta gu铆a necesitas de Laravel 5.8 o superior.

Paso 1. Crear un proyecto Laravel nuevo

Puedes crear el proyecto Laravel usando Composer:

composer create-project --prefer-dist laravel/laravel auth

O si eres de los que prefiere Laravel Installer, puedes hacer lo mismo con laravel new auth.

Como ves:

  • En este caso, auth es el nombre del proyecto.
  • Pero si ya tienes uno creado, puedes seguir los pasos all铆.

Si vas a trabajar con un proyecto nuevo, recuerda que tambi茅n debes configurar las credenciales de acceso a tu base de datos.

Por ejemplo, puedes crear una base de datos llamada "auth", y entonces definir en tu archivo .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=auth
DB_USERNAME=root
DB_PASSWORD=

Paso 2. Instalar el paquete Laravel Passport

Laravel Passport nos permite configurar un servidor de OAuth2 sobre nuestro Laravel en muy poco tiempo.

composer require laravel/passport

Paso 3. Ejecutar las migraciones

El paquete Passport, al descargarse, incluye migraciones.

Es importante ejecutar estas migraciones, para contar con las tablas necesarias para guardar informaci贸n de los clients y access tokens:

php artisan migrate

Si no entiendes muy bien de qu茅 estoy hablando es porque no est谩s familiarizado con el protocolo OAuth2.

En ese caso:

Paso 4. Generar llaves

Para que nuestro proyecto pueda generar access tokens seguros es necesario contar con encryption keys (llaves que se usan en el proceso de encriptaci贸n).

Para ello debemos ejecutar:

php artisan passport:install

Este comando adem谩s va a crear clients, que luego podemos usar para generar access tokens:

Install Laravel Passport

Paso 5. Configuraci贸n de Passport

Ahora debes agregar el trait Laravel\Passport\HasApiTokens a tu modelo App\User.

Este trait habilita m茅todos para el modelo, que te permitir谩n inspeccionar el token del usuario autenticado y sus scopes correspondientes.

<?php namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;
    // ...
}

Para que Passport funcione correctamente tambi茅n debes habilitar sus rutas.

Para esto basta con llamar el m茅todo Passport::routes dentro del AuthServiceProvider de tu proyecto.

Espec铆ficamente dentro del m茅todo boot.

Estas rutas permiten a Passport hacer issue y revoke de access tokens y clients.

<?php namespace App\Providers;

use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    // ...
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes(); // <---
    }
}

Con esto listo ya puedes ir a tu archivo de configuraci贸n config/auth.php y asignar el driver "passport" para el authentication guard llamado "api":

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport', // <---
        'provider' => 'users',
    ],
],

De esta manera, Passport se encargar谩 de validar las peticiones entrantes a la API.

Hasta aqu铆 ya tenemos Laravel Passport configurado correctamente.


Sin embargo, la pregunta es:

驴c贸mo podemos usar Passport y definir las primeras rutas de nuestra API?

Veamos ello a continuaci贸n.

Paso 6. Definir las rutas principales para la API

S贸lo debes dirigirte al archivo routes/api.php, y agregar all铆:

Route::group([
    'prefix' => 'auth'
], function () {
    Route::post('login', 'AuthController@login');
    Route::post('signup', 'AuthController@signUp');
  
    Route::group([
      'middleware' => 'auth:api'
    ], function() {
        Route::get('logout', 'AuthController@logout');
        Route::get('user', 'AuthController@user');
    });
});

驴Qu茅 hace este c贸digo?

  • Define 4 rutas, asignando a todas un prefijo "auth".
  • Las 2 primeras rutas son p煤blicas, y las 2 siguientes requieren de autenticaci贸n.

Paso 7: Crear un Controlador para resolver las rutas

En el paso anterior hemos declarado 4 rutas, cada una asociada con un m茅todo del controlador AuthController.

Entonces s贸lo hace falta crear dicho controlador:

class AuthController extends Controller
{
    /**
     * Registro de usuario
     */
    public function signUp(Request $request)
    {
        $request->validate([
            'name' => 'required|string',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string'
        ]);

        User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        return response()->json([
            'message' => 'Successfully created user!'
        ], 201);
    }
  
    /**
     * Inicio de sesi贸n y creaci贸n de token
     */
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
            'remember_me' => 'boolean'
        ]);

        $credentials = request(['email', 'password']);

        if (!Auth::attempt($credentials))
            return response()->json([
                'message' => 'Unauthorized'
            ], 401);

        $user = $request->user();
        $tokenResult = $user->createToken('Personal Access Token');

        $token = $tokenResult->token;
        if ($request->remember_me)
            $token->expires_at = Carbon::now()->addWeeks(1);
        $token->save();

        return response()->json([
            'access_token' => $tokenResult->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => Carbon::parse($token->expires_at)->toDateTimeString()
        ]);
    }
  
    /**
     * Cierre de sesi贸n (anular el token)
     */
    public function logout(Request $request)
    {
        $request->user()->token()->revoke();

        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }
  
    /**
     * Obtener el objeto User como json
     */
    public function user(Request $request)
    {
        return response()->json($request->user());
    }
}

Paso 8: Verificar el funcionamiento de la API

Aqu铆 puedes iniciar un servidor con PHP usando php artisan serve.

Sin embargo, si dispones de un servidor web como Apache, lo mejor es que definas VirtualHosts para tus proyectos.

Para probar nuestra API debemos hacer peticiones a las rutas que hemos definido.

Una forma muy conveniente de hacerlo es a trav茅s de Postman.

隆Entonces empecemos!

Headers

Dado que estamos consultando una API Rest que devuelve datos en formato JSON, es importante agregar los siguientes 2 headers en cada una de nuestras peticiones:

Content-Type: application/json
X-Requested-With: XMLHttpRequest
Headers en Postman

Registro

Hacemos una petici贸n POST y registramos un usuario con nuestros datos.

Registro a trav茅s de la API

Login

Usando nuestros datos de usuario podemos iniciar sesi贸n, y obtener un access_token, que nos permitir谩 identificarnos ante la API.

Login a trav茅s de la API

Datos de usuario

Podemos consultar rutas protegidas enviando un Authorization header y el token que obtuvimos anteriormente.

Datos de usuario v铆a API

Cerrar sesi贸n

Si hacemos una petici贸n GET a la ruta de logout con nuestro token, 茅ste ser谩 invalidado.

Cierre de sesi贸n con relaci贸n a la API

No autenticado

De modo que si intentamos obtener nuestros datos de usuario con el mismo token, la API protegida por el middleware nos responder谩 que no estamos autenticados.

Sin autorizaci贸n para consultar la API de usuario

Referencias

# laravel # oauth

Logo de Programaci贸n y m谩s

Comparte este post si te fue de ayuda 馃槈.

Reg铆strate

Accede a todos los cursos, y mejora tus habilidades 馃殌.

Cursos Recomendados 馃殌

Imagen para el curso Laravel y OAuth2

Laravel y OAuth2

Veamos c贸mo implementar un login mediante redes sociales! Aprende y aplica esto sobre cualquier proyecto Laravel.

Iniciar curso
Imagen para el curso Laravel y Android

Laravel y Android

Curso intensivo. Incluye el desarrollo de una API, su consumo, y autenticaci贸n v铆a JWT. Tambi茅n vemos Kotlin desde 0.

Iniciar curso
Imagen para el curso Aprende Vue 3

Aprende Vue 3

Nuevo curso! Aprende Vite, Pinia, Vuetify, Vue Router y TypeScript. Desarrolla un eCommerce desde cero.

Iniciar curso

Art铆culos Relacionados 馃摎

Espera un momento 馃巵 ...

驴Te gustar铆a aprender a programar, gratis?

Mago de Programaci贸n y m谩s

S贸lo debes registrarte 馃槈.