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:
Activamos el middleware que tendremos comentado:
Activamos el AuthServiceProvider que tendremos comentado:
Registramos los siguientes “service providers”:
- Ejecutar “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”.
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:
- Modificar el modelo “User”, añadiendo el trait “HasApiTokens”:
- Abrir el archivo app/Providers/AuthServiceProvider, y añadir lo siguiente:
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:
- 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.
Ahora, añadiremos un “Header” como el siguiente al realizar cualquier llamada a nuestro API:
Authorization Bearer <token-generado>
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
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.
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.
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»
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.
Buenas, estoy siguiendo el tutorial, hasta ahora todo bien, solo tengo una duda, el client_id y el secret, como los obtengo desde una app externa a la API?
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.