API REST con autenticación en Laravel

En este tutorial te voy a mostrar cómo crear una API REST en Laravel usando Laravel Passport. Gracias a esto podrás exponer tu API y consumirla con JavaScript (para una app web del lado del cliente) o con una app móvil y cualquier lenguaje que hable HTTP con JSON.

Lo interesante es que además de configurar una API JSON en Laravel, vas a aprender cómo agregar autenticación; de este modo los usuarios podrán iniciar sesión, recibir un token y luego usarlo para realizar las otras operaciones.

Verás que es muy sencillo. Al final del post colocaré unas pruebas de consumo de la API con Postman.

Requisitos

Necesitamos obviamente una app de Laravel existente y funcional, además de composer. No importa si está recién creada o ya tiene un avance.

Si quieres que tu aplicación tenga autenticación, debes usar la autenticación que Laravel trae por defecto. En caso de que no quieras autenticación o no hayas seguido los métodos de Laravel, tendrás que hacer los ajustes pertinentes en cada lugar.

Instalar passport

Comenzamos instalando el paquete laravel/passport pues no viene incluido por defecto en el framework. Ejecuta:

composer require laravel/passport

Más tarde migra tu base de datos pues se necesita hacer unas cosas de oauth:

php artisan migrate

Después, generar claves para passport:

php artisan passport:install

La salida debe ser algo así:

Modificar el modelo de User

Dentro de User (el modelo) debemos agregar el trait de HasApiTokens. Para ello miramos el encabezado del archivo y vemos que dice algo como use Notifiable, agregamos HasApiTokens.

Además, también agregamos el use Laravel\Passport\HasApiTokens; y al final el archivo User.php debe verse parecido a lo siguiente:

Modificando AuthServiceProvider para las rutas

Ahora en AuthServiceProvider.php (dentro de app/Providers)en el encabezado agregamos un use Laravel\Passport\Passport; y dentro del método boot invocamos a Passport::routes();

El archivo debe ser parecido a lo siguiente:

Passport para guard de autenticación

En config/auth.php dentro de guards > api en driver colocamos passport. Mi archivo quedó así:

Presta atención a la línea 45 pues es la única que se cambia.

Controlador Auth

Creamos un controlador, en mi caso lo llamaré AuthController, y como vamos a usar el namespace de Auth dentro de Facades al inicio agregamos un use Illuminate\Support\Facades\Auth;

En este archivo es en donde manejamos toda la autenticación de la API, iniciamos sesión devolviendo un token, cerramos sesión, etcétera.

Debo admitir que este archivo lo he copiado (pero no por ello no lo he analizado) y le he hecho ligeras modificaciones. Agradecimientos a quien lo haya creado originalmente

Básicamente estamos creando un controlador de Laravel en donde registramos, logueamos y mostramos al usuario logueado, pero usando JSON en lugar de plantillas de blade o similares; ya que la API de Laravel va a usar JSON para la transmisión de datos.

Para esto usamos todas las medidas que se siguen al registrar usuarios: se hacen las validaciones pertinentes, la contraseña es hasheada, etcétera.

Resumen hasta el momento

Hasta ahora mis comandos con su salida han sido:

Configurando y protegiendo rutas

Ahora vamos a configurar las rutas dentro de routes/api.php; vamos a prefijarlas con auth, así no interfieren con otras e indicamos claramente que pertenecen a la API.

Dentro de la configuración de esas rutas también agregamos un grupo de rutas que tendrán el middleware auth:api; de este modo hacemos que solo estén disponibles si quien consume la API tiene un token válido.

Como lo indico en los comentarios, es justo dentro de ese grupo de rutas que debes agregar tus otros métodos; es decir, armar toda tu API.

Probando API de Laravel

Ahora vamos a probar la API REST con JSON que acabamos de crear con Laravel. Como lo dije, puedes consumirla desde cualquier lugar que hable JSON y HTTP (la web del lado del cliente con JS, apps móviles e incluso lenguajes de servidor).

Para probar de manera simple voy a usar Postman. Te repito que puedes agregar más rutas de acuerdo a tus necesidades; no hay límite en esto.

La ruta de la API

Normalmente, si usas Apache con Laravel, visitas la ruta public. Ahora sería la public/api/auth/ y en caso de que no uses Apache entonces sería la ruta raíz agregando /api/auth/.

Obviamente tienes que agregar la ruta a la ruta de la API. Por ejemplo, para hacer login sería /api/auth/login.

Nota: recuerda que los datos deben ser enviados codificados como JSON. También debes especificar el encabezado Content-Type en application/json y opcionalmente el X-Requested-With en XMLHttpRequest.

Iniciar sesión y obtener token de API: login

Lo primero que necesitamos es obtener un token al iniciar sesión. Este token será de tipo bearer y será devuelto en caso de que el usuario y la contraseña sean correctos.

Debemos hacer una petición post a /login con dos datos JSON: email y password. Algo así:

Si son incorrectos, la respuesta será:

En caso de que los datos sean correctos, la respuesta será:

Ahora es tu responsabilidad guardar el token, la fecha de expiración, etcétera. La petición dentro de Postman se ve así:

Autenticación en API REST de Laravel usando token

Obtener usuario logueado

Aunque probablemente estés pensando “y para qué quiero conocer el usuario logueado” este ejemplo muestra cómo consumir determinada ruta que necesite que el usuario esté logueado.

La petición debe ser de tipo get a la ruta /user. Debes incluir el token en los encabezados. El nombre del encabezado es Authorization y el valor del encabezado debe ser Bearer [aquí el token recibido al iniciar sesión]

Te explico bien lo de Bearer pues a mí me costó comprenderlo: debes concatenar la cadena "Bearer", un espacio y el token que habías recibido. Suponiendo que el token es 123 entonces el valor del encabezado sería "Bearer 123".

En caso de que el token sea inválido, la respuesta será:

Y en caso de que sea válido, la respuesta será algo como:

Adjunto una captura de postman por si te quedan dudas:

Consumir API REST de Laravel con Postman – Probando API JSON

En este caso, por obvias razones, devuelve el usuario. Pero bien podría devolver otros datos según lo programes; al final será una API que puede interactuar con todo el ecosistema de Laravel.

Al clonar el repositorio

Si llevas un control de versiones con, por ejemplo, git; cada que clones tu repositorio recuerda generar las claves con:

php artisan passport:install

Conclusión

Recuerda que este es un ejemplo y una guía; no es que tengas que seguirla paso a paso, puedes hacerle tus modificaciones (como yo lo hice), agregarle más o menos métodos, configurar otras rutas, etcétera.

Con esto puedes extender tu app de Laravel más allá del lenguaje del servidor.

Si te sirve de algo puedes ver el commit exacto en donde agregué la API con autenticación en Laravel a mi sistema de ventas. También te invito a explorar más sobre Laravel en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

3 comentarios en “API REST con autenticación en Laravel”

Dejar un comentario