Seleccionar página

Hemos visto la autenticación en uno de los primeros post pero aunque funciona, la solución era muy intrusiva. En este post, veremos una solución cuya ventaja es que no tocamos ningún archivo del directorio «vendor» de Laravel y esa es la manera de trabajar con este maravilloso framework PHP.

Estos son los pasos a seguir:

  • Scaffolding del sistema de autenticación de Laravel.
  • Instalar el paquete JWT-Auth (para la autenticación y manejo de los tokens).
  • Instalar el paquete JWT Guard (para usar jwt como driver de autenticación) aquí.
  • Personalizar los siguientes archivos para que funcione con JWT’s:
    • El driver de autenticación.
    • El modelo de usuario «User».
    • El controlador de inicio de sesión.
  • Crear un middleware que extienda el que Laravel nos provee.
  • Crear un service provider para poder usar el «guard» que queramos, en nuestro caso con el driver «api», en grupos de rutas.

Lo primero es hacer el scaffolding del sistema de autenticación. Para ello, ejecutamos el comando:

El comando anterior nos genera entre otras cosas, el directorio «Auth» en «App\Http\Controllers\» con varios controladores de los cuales editaremos el de inicio de sesión «LoginController.php» y el de registro «RegisterController.php».

Ahora instalamos los paquetes de terceros:

Ahora edita el siguiente archivo:

Al acabar, hay que publicar el archivo de configuración de ese paquete y luego establecer la «key» privada que se usará para descifrar los tokens (lo hace JWT-Auth automáticamente y de forma transparente a nosotros).

Turno de JWT Guard:

Requerimos el paquete:

Registramos el service provider:

Configuramos el driver de autenticación:

Editamos el modelo User tal que:

Turno del controlador de inicio de sesión. La clase «LoginController» que se encarga de ello está prácticamente vacía porque sus funciones las lleva a cabo el trait AuthenticatesUsers. Sobreescribiremos las funciones incluídas en el trait copiando y pegando las que necesitemos directamente en el controlador, quedando así:

Ya que la versión en desarollo de jwt-auth no incluye las respuestas JSON para informar del estado del token enviado en las cabeceras en cada petición, tenemos que crear nuestro propio middleware para que lo haga.

Nuestra tarea consistirá en crear nuestro propio middleware extendiendo el que trae Laravel por defecto y que podemos encontrar en «vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php«.

Por último registramos el middleware personalizado y comentamos el de Laravel, tal que:

Configurado el proyecto, tenemos que probarlo pero antes hay que tener en cuenta que no funcionará si no especificamos el «guard» a usar en cualquier ruta que use el controlador «LoginController». Pero el problema es que Laravel no trae una forma cómoda de usar esta opción en las rutas. Por tanto, vamos a hacer un hack extraído de aquí:

Creamos un service provider personalizado:

Editamos el archivo generado, tal que:

Y registramos el provider:

Aquí te muestro rutas a modo de ejemplo de uso:

Te preguntarás, ¿cuál es la ventaja?. Pues la ventaja es que en las rutas en las que es necesario acceder a datos del usuario autenticado (logueado), en vez de usar la siguiente forma «Auth::guard(‘api’)->user()», usaremos en «Auth::user()» ya que el hack se encarga de asignar el driver que le pasemos como parámetro, en este caso, el driver «api».