Cómo usar Laravel Passport para la autenticación de API REST
En el desarrollo web actual, las API o los servicios web son muy populares. Al desarrollar una aplicación móvil, la API juega un papel de puente para pasar datos entre la aplicación móvil y la web. Mantener las llamadas a las API seguras y autenticadas es importante para proteger los datos que se transfieren de una aplicación a otra.
En este artículo, estudiamos sobre Laravel Passport que nos permite autenticar API. Passport está construido en la parte superior del servidor OAuth2, que es mucho más seguro en la forma en que se construye.
Cuando se trata de las API, solíamos enviar un token de acceso para verificar si la solicitud entrante es válida. Si está autorizado, solo debe permitir interactuar con la aplicación. El pasaporte de Laravel proporciona una forma conveniente de crear y verificar el token con la llamada a la API.
Instalación
Para comenzar, asumimos que ha instalado Laravel en su sistema. Para instalar Passport, ejecute el siguiente comando en la terminal.
composer require laravel/passport
El comando anterior funcionaría con la última versión de Laravel. Si está ejecutando una versión anterior, el comando será ligeramente diferente según su versión de Laravel. Por ejemplo, si tiene Laravel 5.5 instalado, su comando debería ser:
composer require laravel/passport=~4.0
Este comando crea su propio directorio de migraciones de base de datos. Estas migraciones crearán tablas que almacenan los clientes y tokens de acceso.
En su config/app.php
archivo, registre el proveedor de servicios de Passport en la matriz de proveedores.
config / app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Ejecutemos la migración que creará las tablas de la base de datos para Passport.
php artisan migrate
Ahora, si va a su cliente de base de datos, notará las nuevas tablas creadas en su base de datos.
A continuación, ejecute el siguiente comando que crea claves de cifrado para generar tokens de acceso seguro. El siguiente comando crea clientes de "acceso personal" y "concesión de contraseña" que se almacenan en la tabla oauth_clients
.
php artisan passport:install
El usuario puede copiar estos tokens para los siguientes pasos. De hecho, vamos a ver 2 formas de crear tokens de acceso. Uno es a través de estos clientes de "concesión de contraseña" y otro es la autenticación de inicio de sesión.
Configuración de pasaporte
Dirígete a los directorios de Laravel y abre el AppUser
archivo del modelo. En este archivo necesitamos agregar un LaravelPassportHasApiTokens
rasgo.
aplicación / User.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Después de esto, tenemos que llamar al Passport::routes
método en el boot
método de AuthServiceProvider
.
app / Providers / AuthServiceProvider.php
<?php
namespace AppProviders;
use LaravelPassportPassport;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'AppModel' => 'AppPoliciesModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
Por último, en el config/auth.php
archivo, configure la opción ‘controlador’ de la protección de autenticación ‘api’ en ‘pasaporte’ de la siguiente manera:
config / auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Cree una API REST y protéjala con Laravel Passport
Laravel crea un archivo routes/api.php
donde debemos declarar nuestro punto final de API REST. Podemos proteger nuestra API agregando el middleware auth:api
.
rutas / api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
Para varios puntos finales, no es necesario agregar middleware cada vez. En cambio, podemos hacerlo de la siguiente manera:
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Como nuestros ‘productos’ de punto final están protegidos si lo llamamos directamente sin el token de autorización, obtenemos una respuesta ‘No autenticado’.
Significa que, al llamar a la API, es esencial pasar el token de autorización en cada solicitud. Entonces, Passport verificará el token y devolverá la respuesta.
Generar token de acceso para API
Hay varias formas de crear un token de acceso para la aplicación. Veremos 2 de ellos para este tutorial.
Primera opción
En una primera forma, debes llamar al token / oauth / con los parámetros requeridos y obtendrás el token como respuesta.
Suponemos que está utilizando una biblioteca HTTP de Guzzle para realizar una solicitud de API. Supongamos que tiene otro proyecto desde el que realiza una solicitud de API.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://laravel.dev',
]);
$response = $client->post('/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => '8qyKG7WKb3O3FZh2hUyEOZ3dAj5l9S5ljn2bdeJf',
'username' => '[email protected]',
'password' => 'my_password',
'scope' => '*',
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
El código anterior devuelve una matriz que contiene una clave ‘access_token’. Los parámetros client_id y client_secret que obtuvimos cuando ejecutamos passport:install
. También puede obtener estos detalles de la tabla de su base de datos ‘oauth_clients’.
Vuelva a intentarlo desde el cartero pasando el access_token al punto final de ‘productos’ y deberíamos obtener la respuesta.
En realidad, debe llamar a esta API como se muestra a continuación:
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Segunda opción
En la primera opción, debe conocer client_id y client_secret para generar su token. Esta puede no ser una forma conveniente en algunos escenarios. Passport ofrece otra opción para generar token de acceso mediante credenciales de inicio de sesión únicamente.
En nuestro, ApiController.php
agregue el método de inicio de sesión con la solicitud de publicación y escriba el código a continuación.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
use IlluminateSupportFacadesAuth;
class ApiController extends Controller
{
public function login(){
if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')-> accessToken;
return response()->json(['success' => $success], 200);
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
}
Para realizar esta llamada a la API, necesitamos registrar una ruta para ella.
rutas / api.php
Route::post('login', 'ApiController@login');
El usuario puede realizar una solicitud de publicación HTTP a esta API escribiendo el código a continuación:
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Esperamos que comprenda el uso de Laravel Passport para la autenticación de API REST. Nos gustaría conocer su opinión en la sección de comentarios a continuación. También recomendamos leer el artículo Tutorial de la API de Laravel: Cómo construir y probar una API RESTful que encontramos útil para los lectores.