Conectar dos servidores con Laravel Passport

Escenario

Estoy en el proceso de separar la parte API de una web de la del frontend. Para ello he creado un nuevo proyecto que solo atenderá peticiones del API. Ambos proyectos comparten la base de datos; en el proyecto API (PA) instalé Laravel Passport para gestionar la autenticación. El proyecto web (PW) necesita por tanto autenticarse en al API para mostrar los datos en sus páginas.

Problema

PA solo admite autenticación por OAuth, gestionada por Passport; como es obvio no vamos a pedir al usuario que se identifique en dos sitios. Necesito un sistema que permita a PW invocar PA sin necesidad de enviar el usuario y contraseña.

Solución

# Configuración del servidor del API

Para empezar damos de alta un nuevo cliente de Passport con el siguiente comando: Tras asignarle un nombre (o dejar el de por defecto), el comando nos debería devolver la siguiente información que habremos de guardar para su posterior uso:

Vamos a necesitar añadir un nuevo middleware que gestione las peticiones con un token de cliente, y la ruta que nos devolverá las credenciales del usuario:

EnHttp/Kernel.php en la lista $routeMiddleware: En routes/api.php El controlador tendría esta pinta: Y la serialización del usuario ésta:

# Configuración del servidor web

He instalado Socialite, una biblioteca de Laravel que usa OAuth para autenticarse con proveedores externos. Empezamos por configurar el servidor web, añadimos este nuevo servicio en config/services.php: Las correspondientes claves en .env Y añadimos el proveedor en config.app: Una vez configurado creamos el proveedor de Passport extendiendo Laravel\Socialite\Two\AbstractProvide;
Nota: uso Sentinel para la autenticación/autorización en la aplicación, en caso de usar la herramienta incluida por defecto en Laravel habría que remplazar Sentinel::getUser()->id por auth()->user()->id.
Extendemos Socialite para que incluya el driver passport Ahora podemos usar un controlador que que devolverá la información del usuario con el token para autenticarse en el API. En routes/web.php Y en Frontend\SecurityController@apiProviderCallback: Que devolería este JSON: Si quisiéramos acceder por javascript desde PW al PA, haríamos algo del tipo:
Nota: en caso de topar con errores relacionados con ‘Access-Control-Allow-Origin’, prueba a instalar el paquete laravel-cors.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *