Comment utiliser Laravel Passport pour l’authentification API REST
Dans le développement Web d’aujourd’hui, les API ou les services Web sont très populaires. Lors du développement d’une application mobile, l’API joue un rôle de passerelle pour la transmission de données entre l’application mobile et le web. Il est important de garder les appels d’API sécurisés et authentifiés pour protéger les données transférées d’une application à l’autre.
Dans cet article, nous étudions le Laravel Passport qui nous permet d’authentifier les API. Passport est construit sur le dessus du serveur OAuth2 qui est beaucoup plus sécurisé dans la façon dont il est construit.
Lors du traitement des API, nous envoyions un jeton d’accès pour vérifier si la demande entrante est valide. S’il est autorisé, alors seulement il devrait permettre d’interagir avec l’application. Le passeport Laravel fournit un moyen pratique de créer et de vérifier le jeton par rapport à l’appel d’API.
Installation
Pour commencer, nous supposons que vous avez installé Laravel sur votre système. Pour installer le passeport, exécutez la commande ci-dessous dans le terminal.
composer require laravel/passport
La commande ci-dessus fonctionnerait avec la dernière version de Laravel. Si vous utilisez une ancienne version, la commande sera légèrement différente en fonction de votre version de Laravel. Par exemple, si Laravel 5.5 est installé, votre commande devrait être :
composer require laravel/passport=~4.0
Cette commande crée son propre répertoire de migrations de bases de données. Ces migrations créeront des tables qui stockeront les clients et les jetons d’accès.
Dans votre config/app.php
fichier, enregistrez Passport service provider dans le tableau des fournisseurs.
config/app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Exécutons la migration qui créera les tables de base de données pour Passport.
php artisan migrate
Maintenant, si vous allez dans votre client de base de données, vous remarquerez les nouvelles tables créées dans votre base de données.
Ensuite, exécutez la commande ci-dessous qui crée des clés de chiffrement pour générer des jetons d’accès sécurisés. La commande ci-dessous crée des clients « accès personnel » et « octroi de mot de passe » qui sont stockés dans la table oauth_clients
.
php artisan passport:install
L’utilisateur peut copier ces jetons pour les étapes suivantes. En fait, nous allons voir 2 façons de créer des jetons d’accès. L’un est à travers ces clients « octroi de mot de passe » et un autre est sur l’authentification de connexion.
Configuration du passeport
Dirigez-vous vers les répertoires Laravel et ouvrez le AppUser
fichier modèle. Dans ce fichier, nous devons ajouter LaravelPassportHasApiTokens
trait.
app/Utilisateur.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Après cela, nous devons appeler la Passport::routes
méthode dans la boot
méthode 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();
}
}
Enfin, dans le config/auth.php
fichier, définissez l’option ‘driver’ de ‘api’ authentication guard sur ‘passport’ comme suit :
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Créez une API REST et protégez-la avec Laravel Passport
Laravel crée un fichier dans routes/api.php
lequel nous devons déclarer le point de terminaison de nos API REST. Nous pouvons protéger notre API en y ajoutant le middleware auth:api
.
routes/api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
Pour plusieurs points de terminaison, nous n’avons pas besoin d’ajouter un middleware à chaque fois. Au lieu de cela, nous pouvons le faire comme suit :
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Comme nos « produits » de point de terminaison sont protégés si nous l’appelons directement sans jeton d’autorisation, nous obtenons une réponse « non authentifié ».
Cela signifie que lors de l’appel de l’API, il est essentiel de transmettre le jeton d’autorisation dans chaque demande. Ainsi, Passport vérifiera le jeton et renverra la réponse.
Générer un jeton d’accès pour l’API
Il existe plusieurs façons de créer un jeton d’accès pour l’application. Nous en verrons 2 pour ce tutoriel.
Première option
Dans un premier temps, vous devez appeler le /oauth/token avec les paramètres requis et vous obtiendrez le token en réponse.
Nous supposons que vous utilisez une bibliothèque HTTP Guzzle pour effectuer une requête API. Disons que vous avez un autre projet à partir duquel vous faites une demande d’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);
Le code ci-dessus renvoie un tableau qui contient une clé ‘access_token’. Les paramètres client_id et client_secret que nous avons obtenus lors de l’exécution de passport:install
. Vous pouvez également obtenir ces détails à partir de votre table de base de données ‘oauth_clients’.
Essayez à nouveau depuis le facteur en passant le access_token au point de terminaison « produits » et nous devrions obtenir la réponse.
En réalité, vous devez appeler cette API comme ci-dessous :
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Deuxième option
Dans la première option, vous devez connaître client_id et client_secret pour générer votre jeton. Cela peut ne pas être un moyen pratique dans certains scénarios. Passport fournit une autre option pour générer un jeton d’accès via les informations de connexion uniquement.
Dans notre ApiController.php
ajoutez la méthode de connexion avec la demande de publication et écrivez le code ci-dessous dedans.
<?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);
}
}
Pour effectuer cet appel d’API, nous devons enregistrer une route pour celui-ci.
routes/api.php
Route::post('login', 'ApiController@login');
L’utilisateur peut envoyer une requête HTTP post à cette API en écrivant le code ci-dessous :
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Nous espérons que vous comprenez l’utilisation de Laravel Passport pour l’authentification API REST. Nous aimerions entendre vos pensées dans la section des commentaires ci-dessous. Nous vous recommandons également de parcourir l’article Laravel API Tutorial: How to Build and Test a RESTful API que nous avons trouvé utile pour les lecteurs.