Configurar un servidor OAuth2 utilizando Passport en Laravel

En este artículo, vamos a explorar cómo podría configurar un servidor OAuth2 completo en Laravel usando la biblioteca Laravel Passport. Revisaremos las configuraciones de servidor necesarias junto con un ejemplo del mundo real para demostrar cómo podría consumir las API de OAuth2..

Supongo que está familiarizado con los conceptos básicos de OAuth2 y el flujo, ya que los discutiremos en el contexto de Laravel. De hecho, la biblioteca Laravel Passport facilita la configuración rápida de un servidor OAuth2 en su aplicación. Por lo tanto, otras aplicaciones de terceros pueden consumir las API proporcionadas por su aplicación.

En la primera mitad del artículo, instalaremos y configuraremos las bibliotecas necesarias, y la segunda mitad analizará cómo configurar los recursos de demostración en su aplicación y consumirlos de aplicaciones de terceros..

Configuraciones de servidor

En esta sección, instalaremos las dependencias necesarias para que la biblioteca de Passport funcione con Laravel. Después de la instalación, hay un poco de configuración por la que tendremos que pasar para que Laravel pueda detectar la biblioteca de Passport.

Sigamos adelante e instalemos la biblioteca de Passport usando el compositor.

$ compositor requiere laravel / pasaporte

Eso es prácticamente todo lo que se refiere a la instalación de la biblioteca de Passport. Ahora asegurémonos de que Laravel lo sepa..

Al trabajar con Laravel, es probable que conozca el concepto de un proveedor de servicios que le permita configurar servicios en su aplicación. Por lo tanto, siempre que desee habilitar un nuevo servicio en su aplicación Laravel, solo necesita agregar una entrada de proveedor de servicios asociado en el config / app.php.

Si aún no conoce a los proveedores de servicios de Laravel, le recomendaría encarecidamente que se haga un favor y lea este artículo introductorio que explica los conceptos básicos de los proveedores de servicios en Laravel..

En nuestro caso, solo tenemos que añadir el PasaporteServicioProveedor proveedor a la lista de proveedores de servicios en config / app.php como se muestra en el siguiente fragmento.

... 'proveedores' => [/ * * Laravel Framework Service Providers… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ CacheServiceProvider: : class, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ Filesystem :: Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate Ppp \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Package Service Providers ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Application Service Providers ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Passport \ PassportServiceProvider :: class,], ... 

A continuación, tenemos que ejecutar el emigrar comando artesanal, que crea las tablas necesarias en una base de datos para la biblioteca de Passport.

$ php artesano migra

Para ser precisos, crea siguiendo las tablas en la base de datos..

oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens

A continuación, debemos generar un par de claves públicas y privadas que la biblioteca de Passport utilizará para el cifrado. Como se esperaba, la biblioteca de Passport proporciona un comando artesanal para crearlo fácilmente.

$ php pasaporte artesanal: instalar

Eso debería haber creado claves en almacenamiento / oauth-public.key y almacenamiento / oauth-private.key. También crea algunas credenciales de cliente de demostración a las que volveremos más adelante..

Avanzando, vamos oauthify la clase de modelo de usuario existente que Laravel utiliza para la autenticación. Para hacer eso, necesitamos agregar el HasApiTokens rasgo a la Usuario clase modelo Hagamos eso como se muestra en el siguiente fragmento de código..

los HasApiTokens El rasgo contiene métodos de ayuda que se utilizan para validar tokens en la solicitud y verificar el alcance de los recursos que se solicitan en el contexto del usuario autenticado actualmente.

Además, debemos registrar las rutas proporcionadas por la biblioteca de Passport con nuestra aplicación Laravel. Estas rutas se utilizarán para operaciones estándar de OAuth2 como la autorización, la solicitud de tokens de acceso y similares..

En el método de arranque de la aplicación / Proveedores / AuthServiceProvider.php Archivo, registremos las rutas de la biblioteca de pasaportes..

… / ** * Registrar cualquier servicio de autenticación / autorización. * * @return void * / public function boot () $ this-> registerPolicies (); Pasaporte :: rutas (); … 

Por último, pero no menos importante, tenemos que cambiar el api conductor de token a pasaporte en el config / auth.php archivo, ya que vamos a utilizar la biblioteca de Passport para la autenticación API.

'guards' => ['web' => ['driver' => 'session', 'provider' => 'users',], 'api' => ['driver' => 'passport', 'provider' => 'usuarios',],],

Hasta ahora, hemos hecho todo lo que se requiere en lo que respecta a la configuración del servidor OAuth2.

Configurar los recursos de demostración

En la sección anterior, hicimos todo el trabajo duro para configurar el servidor de autenticación OAuth2 en nuestra aplicación. En esta sección, configuraremos un recurso de demostración que podría solicitarse mediante la llamada a la API.

Intentaremos mantener las cosas simples. Nuestro recurso de demostración devuelve la información del usuario siempre que haya una válida uid parámetro presente en el OBTENER solicitud.

Vamos a crear un archivo controlador app / Http / Controllers / UserController.php con los siguientes contenidos.

obtener ("uid", 0); $ user = User :: find ($ user_id); devuelve $ usuario; 

Como de costumbre, también debe agregar una ruta asociada, que se supone que debe agregar en el rutas / web.php expediente. Pero de lo que estamos hablando es de la ruta API, y por eso necesita un tratamiento especial..

Las rutas API se definen en el rutas / api.php expediente. Entonces, sigamos adelante y agreguemos nuestra ruta API personalizada como se muestra en el siguiente fragmento de código.

get ('/ user', function (Request $ request) return $ request-> user ();); // ruta API personalizada Route :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');

Aunque lo hemos definido como / usuario / obtener, La ruta API efectiva es / api / usuario / obtener, y eso es lo que debe usar cuando solicita un recurso a través de esa ruta. los api el prefijo es manejado automáticamente por Laravel, y no tiene que preocuparse por eso!

En la siguiente y última sección, analizaremos cómo puede crear credenciales de cliente y consumir la API OAuth2.

Cómo consumir las API de OAuth2

Ahora que hemos configurado el servidor OAuth2 en nuestra aplicación, cualquier tercero puede conectarse a nuestro servidor con OAuth y consumir las API disponibles en nuestra aplicación.

En primer lugar, las aplicaciones de terceros deben registrarse en nuestra aplicación para poder consumir las API. En otras palabras, se consideran aplicaciones de cliente y recibirán un ID de cliente y un secreto de cliente al registrarse..

La biblioteca de Passport proporciona un comando artesanal para crear cuentas de clientes sin mucha molestia. Sigamos adelante y creamos una cuenta cliente demo..

$ php artesano pasaporte: cliente ¿A qué ID de usuario se debe asignar el cliente ?:> 1 ¿Cómo debemos nombrar al cliente ?:> Demo OAuth2 Cuenta de cliente ¿Dónde debemos redirigir la solicitud después de la autorización? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Nuevo cliente creado correctamente. ID de cliente: 1 Secreto del cliente: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01

Cuando corres el artesano pasaporte: cliente comando, le hace algunas preguntas antes de crear la cuenta del cliente. Fuera de esos, hay uno importante que te pide la URL de devolución de llamada.

los URL de devolución de llamada es aquella en la que los usuarios serán redirigidos nuevamente al extremo de terceros después de la autorización. Y ahí es donde se enviará el código de autorización que se supone que se utilizará a cambio del token de acceso. Estamos a punto de crear ese archivo en un momento..

Ahora, estamos listos para probar las API de OAuth2 en la aplicación Laravel.

Para propósitos de demostración, crearé la oauth2_client directorio en la raíz del documento en primer lugar. Idealmente, estos archivos se ubicarán en el extremo de un tercero que desee consumir las API en nuestra aplicación Laravel.

Vamos a crear el oauth2_client / auth_redirection.php archivo con los siguientes contenidos.

 '1', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'response_type' => 'code', 'scope' => ",)); header ('Location: http: / /your-laravel-site-url/oauth/authorize?'.$query);

Asegúrate de cambiar la Identificación del cliente y redirect_uri parámetros para reflejar sus propios ajustes, los que usó al crear la cuenta cliente de demostración.

A continuación, vamos a crear el oauth2_client / callback.php archivo con los siguientes contenidos.

 'permission_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01placio de la persona de la naturaleza de la persona de la naturaleza de la naturaleza, la redacción de correo electrónico: código ']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; if (is_array ($ params) && count ($ params)) foreach ($ params as $ key => $ value) $ params_string. = $ key. '='. $ value. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); resultado = curl_exec ($ ch); ch); $ response = json_decode ($ resultado); // compruebe si la respuesta incluye access_token if (isset ($ response-> access_token) && $ response-> access_token) // desea guardar el access_token en la sesión aunque ... $ access_token = $ response-> access_token; // use el token anterior para hacer más llamadas a la API en esta sesión o hasta que el token de acceso caduque $ ch = curl_init (); $ url = 'http: // your-laravel-site -url / api / user / get '; $ header = array (' Authorization: Bearer '. $ access_token); $ query = http_build_query (array (' uid '=>' 1 ')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ query); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ resultado = curl_e xec ($ ch); curl_close ($ ch); $ respuesta = json_decode ($ resultado); var_dump ($ resultado);  else // por alguna razón, el access_token no estaba disponible // la depuración va aquí

Nuevamente, asegúrese de ajustar las URL y las credenciales del cliente de acuerdo con su configuración en el archivo anterior.

Cómo funciona en conjunto

En esta sección, lo probaremos por completo desde la perspectiva de un usuario final. Como usuario final, hay dos aplicaciones frente a usted:

  1. La primera es la aplicación Laravel con la que ya tienes una cuenta. Contiene su información que podría compartir con otras aplicaciones de terceros..
  2. La segunda es la aplicación cliente de terceros., auth_redirection.php y callback.php, que desea obtener su información de la aplicación Laravel utilizando la API de OAuth.

El flujo se inicia desde la aplicación de cliente de terceros. Continúe y abra la URL http: //localhost/oauth2_client/auth_redirection.php en su navegador, y eso lo redireccionará a la aplicación Laravel. Si aún no ha iniciado sesión en la aplicación Laravel, la aplicación le pedirá que lo haga en primer lugar..

Una vez que el usuario ha iniciado sesión, la aplicación muestra la página de autorización..

Si el usuario autoriza esa solicitud, el usuario será redirigido nuevamente a la aplicación cliente de terceros en http: //localhost/oauth2_client/callback.php junto con el código como el OBTENER Parámetro que contiene el código de autorización..

Una vez que la aplicación de terceros recibe el código de autorización, podría intercambiar ese código con la aplicación Laravel para obtener el token de acceso. Y eso es exactamente lo que ha hecho en el siguiente fragmento de la oauth2_client / callback.php expediente.

$ ch = curl_init (); $ url = 'http: // your-laravel-site-url / oauth / token'; $ params = array ('grant_type' => 'permission_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoTp.l.p.l.p.l.p.p.l.p.p.l.png.png , 'código' => $ _REQUEST ['código']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; if (is_array ($ params) && count ($ params)) foreach ($ params as $ key => $ value) $ params_string. = $ key. '='. $ value. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); resultado = curl_exec ($ ch); ch); $ respuesta = json_decode ($ resultado);

A continuación, la aplicación de terceros verifica la respuesta de la solicitud CURL para ver si contiene un token de acceso válido en primer lugar.

Tan pronto como la aplicación de terceros obtenga el token de acceso, podría usar ese token para hacer más llamadas a la API para solicitar recursos según sea necesario desde la aplicación Laravel. Por supuesto, el token de acceso se debe pasar en cada solicitud que solicite recursos de la aplicación Laravel.

Hemos intentado imitar el caso de uso en el sentido de que la aplicación de terceros desea acceder a la información del usuario desde la aplicación Laravel. Y ya hemos creado un punto final de API, http: // your-laravel-site-url / api / user / get, en la aplicación Laravel que lo facilita.

// compruebe si la respuesta incluye access_token if (isset ($ response-> access_token) && $ response-> access_token) // desea guardar el access_token en la sesión aunque… $ access_token = $ response-> access_token; // usa el token anterior para hacer más llamadas a la API en esta sesión o hasta que el token de acceso caduque $ ch = curl_init (); $ url = 'http: // su-laravel-site-url / api / user / get'; $ header = array ('Autorización: Portador'. $ access_token); $ query = http_build_query (array ('uid' => '1')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ query); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ resultado = curl_exec ($ ch); curl_close ($ ch); $ respuesta = json_decode ($ resultado); var_dump ($ resultado); 

Así que ese es el flujo completo de cómo se supone que debes consumir las API de OAuth2 en Laravel.

Y con eso, hemos llegado al final de este artículo..

Conclusión

Hoy exploramos la biblioteca de Passport en Laravel, que nos permite configurar un servidor OAuth2 en una aplicación muy fácilmente.. 

Para aquellos de ustedes que ya están comenzando con Laravel o que desean ampliar sus conocimientos, sitio o aplicación con extensiones, tenemos una variedad de cosas que puede estudiar en Envato Market..

No dudes en compartir tus pensamientos y consultas utilizando la siguiente información!