Autenticado con Passport

Para finalizar con esta serie de posts, vamos ahora a autorizar el endpoint creado con Laravel Passport. Para lograrlo realizamos los siguientes pasos:

Aseguramos las rutas de nuestro endpoint con auth:api de laravel:

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
  Route::resource('posts', 'Api\\PostsController', ['except' => ['create', 'edit']]);
});

Modificamos el archivo config/l5-swagger.php para que utilice passport para la autenticación en el Swagger UI.

...
'security' => [
    'passport' => [ 
        'type'      => 'oauth2',
        'description' =>'Passport Oauth2',
        'in'        => 'header',
        'scheme'    => 'http',
        'flows'     => [
            "password" => [
                "authorizationUrl" => config('app.url') . '/oauth/authorize',
                "tokenUrl"      => config('app.url') . '/oauth/token',
                "refreshUrl"    => config('app.url') . '/token/refresh',
                "scopes"        => []
            ],
        ],
    ]
]
...

Con la configuración anterior le estamos especificando a Swagger que utilice las rutas OAuht2 de Passport para autenticar a los clientes que quieran utilizar nuestra api. Refrescamos la configuración de Swagger si es necesario php artisan l5-swagger:generate

Ahora, si accedes nuevamente al endpoint desde Swagger y ejecutas el Get obtendrás la respuesta 401: Unathorized.

Para finalizar, vamos a verificar cómo autenticar un usuario para que utilice nuestra api autenticándose previamente. Lo primero que debemos tener en cuenta es que debe existir un usuario con el cual autenticarnos en Laravel. Para esto, utilizaremos el sistema de autenticación que provee Laravel por defecto.

Utilizaremos tinker para crear el usuario que usaremos de prueba:
Ejecutamos php artisan tinker y escribimos en la consola el siguiente código PHP:

$user = new App\User();
$user->password = Hash::make('elPassword’);
$user->email = 'the-email@example.com';
$user->save();

Al ejecutar el código anterior debería devolverte en la consola un boolean true si se guardo correctamente. De existir algún error, verifica el mensaje y establece el valor que te esté faltando para poder guardar correctamente el usuario.

Ahora, vamos a asegurarnos de que tenemos un cliente oauth en nuestra tabla oauth_clients para poder proseguir con la autenticación de Swagger. Para eso, buscamos en la tabla oauth_clients un registro que tenga el valor true o 1 en la columna password_client. Si se tiene un registro con estas características ese será el que usaremos, de lo contrario, ejecutamos el siguiente comando en la consola para crearlo: php artisan passport:install.

Por último, vamos a proceder a autenticarnos con Passport con el usuario que acabamos de crear. Entramos nuevamente a http://tuapp.com/api/doc y hacemos click al botón Authorize. Esto nos mostrará un formulario donde debemos colocar los siguientes datos.

Username: the-email@example.com
Password: ‘elPassword’
Type: request-body
Client ID: El id del registro en la tabla oauth_clients
Client secret: El valor del campo secret del registro en la tabla oauth_clients

Hacemos click en el botón Authorize y debería presentarnos la pantalla que tenemos a continuación.

De esta forma, hemos realizado la autenticación de un usuario de Laravel por medio de Passport y Swagger utilizará el token de autorización enviado por Passport en cada solicitud que hagamos a nuestra API.

Existe una forma de Autorizar Swagger que es mucho más sencilla que está pero que solo aconsejamos utilizarla en entornos de desarrollo y cuando tu proyecto es una aplicación “híbrida”, es decir, que provea un api y una aplicación web, ya que con esta última es que se autentica el usuario. Para eso, solo debemos realizar los siguientes pasos:

Ejecutamos el siguiente comando:

php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"

Y por último modificamos el archivo config/l5-swagger.php para que quede así:

'api' => [
  \App\Http\Middleware\EncryptCookies::class,
  \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  \Illuminate\Session\Middleware\StartSession::class,
  \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  \App\Http\Middleware\VerifyCsrfToken::class,
  \Illuminate\Routing\Middleware\SubstituteBindings::class,
  \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
  'auth',
]

Ya con esto puedes entrar al login de tu aplicacion http://tuapp.com/login, autenticarte normalmente y utilizar Swagger con el usuario que se autenticó (http://tuapp.com/api/doc). Verás en la interfaz de usuario de Swagger que el CSRF_TOKEN se envía en cada petición que es el valor que el Middleware de L5-Swagger utiliza para obtener el usuario autenticado.

Conclusión

Hoy en día dividir una plataforma en cliente-servidor es muy usual y el desarrollo de un API basado en restful es algo que cualquier desarrollador debe conocer, independientemente del lenguaje que utilice.

La intención de estos posts fue comprobar cómo dos herramientas independientes pueden trabajar juntas para proveernos una funcionalidad robusta que podemos utilizar en cualquier proyecto sin importar su tamaño.

Recomendamos el uso de Swagger y su integración con laravel por medio del paquete l5-swagger ya que es la mejor forma de documentar un API y que le servirá de mucho a tu equipo de desarrollo o a un equipo de desarrollo de terceros.

La robustez de un proyecto no solo se nota por su performance sino también por lo buena que sea su documentación.

Hemos dejado a un lado el uso de scope para autorizar los recursos, lo cual será una excelente excusa para escribir un nuevo Post sobre Laravel Passport. Igual te recomendamos que visites los links de la documentación oficial para cualquier duda.

Recuerda que en PDG Solutions somos experto en estas y muchas más herramientas. Puedes escribirnos a través del Formulario de Contacto si requieres de nuestra asesoría o visitar nuestro grupo en Facebook.

Summary
Integracion de Swagger y Laravel Passport: Autenticado con Passport
Article Name
Integracion de Swagger y Laravel Passport: Autenticado con Passport
Description
Finalizamos esta serie de posts realizando la autenticación de un usuario de Laravel por medio de Passport y Swagger utilizará el token de autorización enviado por Passport en cada solicitud que hagamos a nuestra API.
Author
Publisher Name
PDG Solutions
Publisher Logo

Compartir:


Omar Yepez

Consultor/Desarollador de aplicaciones Web/Desktop/Mobile desde hace 10 años en los lenguajes Java, PHP y Python.