Creación Rest API con Lumen y OAUTH2

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

Creación Rest API con Lumen y OAUTH2
Valora este post

Rubén González Platas

Programador web. Ayudo a empresas y emprendedores a crear su web corporativa y canal de venta online. ¿Tienes un proyecto en mente y no sabes cómo llevarlo a cabo? Contacta conmigo y te ayudaré.

4 comentarios en “Creación Rest API con Lumen y OAUTH2

  1. Hola amigo, re bien el login pero como obtengo el user_id o el Auth::user()? como obtengo los datos del usuario logeado si no me devuelve el id del usuario? hay alguna ruta para pinchar con el token y me devuelva el user_id?

    • 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.

  2. 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.

    • 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.

Deja un comentario