Creación Rest API con Lumen y OAUTH2

(Last Updated On: 10 agosto, 2020)

Laravel 5.5 incluye «Passport», un método de autorización de API con OAUTH2. Lumen todavía no lo trae por defecto, por lo que podemos hacer uso de la librería “lumen-passport”: https://github.com/dusterio/lumen-passport

  • Ejecutar: composer require dusterio/lumen-passport
  • Abrir el archivo /bootstrap/app.php y hacer los siguientes cambios.

Si no tenemos los Facades y Eloquent activados, los activamos:

Lumen - Activar Facades y Eloquent

 

Activamos el middleware que tendremos comentado:

Lumen - Activar middleware oauth2

 

Activamos el AuthServiceProvider que tendremos comentado:

Lumen - Activar AuthServiceProvider

 

Registramos los siguientes “service providers”:

Registrar ServiceProvider

 

  • Lumen - Ejecutar PHP Artisan MigrateEjecutar “php artisan migrate“, de manera que se creen las nuevas tablas de OAUTH2 en la base de datos.
  • Ejecutar “php artisan passport:install”, para crear las claves de encriptación en la tabla “oauth_clients”.

Lumen - Ejecutar PHP Artisan passport

 

Si quisiéramos crear más claves, podríamos lanzar los siguientes comandos:

  • php artisan passport:client –password (para crear una clave de password)
  • php artisan passport:client –personal (para crear una clave personal)

 

  • Crear un archivo llamado auth.php en el raíz de la aplicación (/config/auth.php). En Lumen no existe el directorio “config”, por lo que hay que crearlo manualmente, al igual que el archivo “auth.php”. Dentro del archivo escribiremos este código:
<?php 
    return [ 'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

    'guards' => [
        'api' =>; [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => \App\User::class
        ]
    ]
];
  •  Cargamos este fichero en /bootstrap/app.php con la siguiente línea:

Lumen - Cargar fichero Auth en la App

 

  • Modificar el modelo “User”, añadiendo el trait “HasApiTokens”:

Lumen - Modificar modelo Users

  • Abrir el archivo app/Providers/AuthServiceProvider, y añadir lo siguiente:

Lumen - Modificar AuthServiceProvider

Como veis, hemos añadido la línea para que el token caduque a los 10 minutos, ya que por defecto el tiempo que otorga es muy largo, y es una buena práctica de seguridad hacer que caduque cada X minutos.

  • A partir de este momento ya podremos insertar rutas para que pasen por el filtro de OAUTH2, de esta manera:

Rutas con OAUTH2

 

  • Si intentamos realizar una llamada, nos devolverá 401 Unauthorized.
  • Cada vez que tengamos que hacer una llamada, deberemos pasar un Token. Por lo tanto, antes debemos generar dicho token haciendo una llamada a la ruta <dominio>/oauth/token, pasándole los siguientes parámetros:
    • grant_type: password
    • client_id: <id cliente creado en bbdd>
    • client_secret: <cadena creada en bbdd>
    • username: <email de tabla users>
    • password: <contraseña de tabla users>

Esta llamada devolverá un Token que será el que debemos usar después para realizar cualquier llamada a nuestro API.

Lumen - Obtener Token

 

Ahora, añadiremos un “Header” como el siguiente al realizar cualquier llamada a nuestro API:

Authorization    Bearer <token-generado>

Lumen - Ejecutar petición con token

 

 

Referencias:

https://github.com/dusterio/lumen-passport
https://devnotes.net/rest-api-development-with-lumen-part-4-oauth2-authentication-seeding/
https://laravel-news.com/passport-grant-types

 

8 comentarios en «Creación Rest API con Lumen y OAUTH2»

    • Hola,
      Si no recuerdo mal, el access token se almacena en una de las tablas que genera la librería y debe tener una relación con el user_id. Siendo así, podrías hacer una segunda petición después de la autenticación para obtener el user_id a partir del access_token como bien dices.

      Un saludo.

      Responder
  1. Hola Ruben

    Gracias por el tutorial, ejecute cada paso tal cual lo indicas, pero al intentar obrener el token del servidor oauth, el mismo me arroja el error:
    {
    «error»: «invalid_credentials»,
    «message»: «The user credentials were incorrect.»
    }

    Estoy ingresando credenciales de un usuario recién creado en la base de datos. de antemano muchas gracias por la valiosa ayuda.

    Responder
    • Hola Carter,
      Está claro que está fallando la autenticación pero si dices que has seguido exactamente todos los pasos, se me hace complicado saber el por qué… tendría que ver el proyecto.
      Revisa la conexión a base de datos y que las rutas pasen por el middleware auth:api.

      Saludos,
      Rubén.

      Responder
  2. Buen dia en entorno de development y testing es exxcelente este turorial, muchas felicidades por ello.

    Sin embargo, en entornos de producción como podriamos crear el client secret de manera dinámica? sin ejecutar el comando de «php artisan passport:install»

    Responder
    • Hola Gustavo,
      Me alegro de que te haya sido de ayuda.
      El comando que comentas al fin y al cabo inserta valores en la base de datos. Podrías hacer un proceso por programación que inserte nuevas filas en la base de datos.

      Saludos,
      Rubén.

      Responder
  3. Hola Valentín,
    Primero debes crear el client_id y client_secret realizando el comando que indico en el tutorial. Estos dos valores los debes insertar en tu aplicación externa para que pueda comunicarse con la API. Digamos que debes saber cuales son. Es el funcionamiento típico de cualquier API, por ejemplo, si intentar trabajar con la API de Mailchimp, debes acceder a este sistema y coger sus parámetros asociados a tu usuario, y así con todos los servicios que quieras llamar desde una aplicación externa.
    Espero haberme explicado.

    Un saludo,
    Rubén.

    Responder

Deja un comentario