Configurer un serveur OAuth2 en utilisant Passport dans Laravel

Dans cet article, nous allons explorer comment configurer un serveur OAuth2 à part entière à Laravel à l'aide de la bibliothèque Laravel Passport. Nous allons passer en revue les configurations de serveur nécessaires ainsi qu'un exemple concret pour illustrer comment utiliser les API OAuth2..

Je suppose que vous connaissez les concepts de base et le flux OAuth2, car nous allons en discuter dans le contexte de Laravel. En fait, la bibliothèque Laravel Passport facilite la configuration rapide d’un serveur OAuth2 dans votre application. Ainsi, d’autres applications tierces peuvent utiliser les API fournies par votre application..

Dans la première moitié de l'article, nous allons installer et configurer les bibliothèques nécessaires. La seconde partie explique comment configurer des ressources de démonstration dans votre application et les utiliser à partir d'applications tierces..

Configurations du serveur

Dans cette section, nous allons installer les dépendances nécessaires pour que la bibliothèque Passport fonctionne avec Laravel. Après l’installation, nous aurons besoin de beaucoup de configuration pour que Laravel puisse détecter la bibliothèque Passport..

Continuons et installons la bibliothèque Passport en utilisant composer.

$ compositeur nécessite laravel / passeport

C'est à peu près tout ce qui concerne l'installation de la bibliothèque Passport. Maintenant, assurons-nous que Laravel soit au courant.

En travaillant avec Laravel, vous connaissez probablement le concept de fournisseur de services qui vous permet de configurer des services dans votre application. Ainsi, chaque fois que vous souhaitez activer un nouveau service dans votre application Laravel, il vous suffit d’ajouter une entrée de fournisseur de service associé dans le répertoire. config / app.php.

Si vous ne connaissez pas encore les fournisseurs de services Laravel, je vous recommande fortement de vous rendre un service et de lire cet article d'introduction qui explique les bases des fournisseurs de services à Laravel..

Dans notre cas, nous avons juste besoin d'ajouter le PassportServiceProvider fournisseur à la liste des fournisseurs de services config / app.php comme indiqué dans l'extrait suivant.

… 'Providers' => [/ * * Fournisseurs de services Laravel Framework… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ ServiceServiceProvider :: class, Illuminate \ Cache \ ServeurProvider: : class, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ FilesystemServiceProvider :: class, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ ServeurProvider :: class \ 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, / * * Fournisseurs de services de packages… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Fournisseurs de services d'application… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Passport \ PassportServiceProvider :: class,],… 

Ensuite, nous devons exécuter le émigrer commande artisan, qui crée les tables nécessaires dans une base de données pour la bibliothèque Passport.

$ php artisan migrate

Pour être précis, il crée en suivant les tables de la base.

oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens

Ensuite, nous devons générer une paire de clés publique et privée qui seront utilisées par la bibliothèque Passport pour le cryptage. Comme prévu, la bibliothèque Passport fournit une commande artisanale pour la créer facilement..

$ passeport d'artisan php: installer

Cela aurait dû créer des clés à storage / oauth-public.key et storage / oauth-private.key. Il crée également des informations d'identification de client de démonstration auxquelles nous reviendrons plus tard..

Aller de l'avant, allons autoriser la classe de modèle utilisateur existante que Laravel utilise pour l'authentification. Pour ce faire, nous devons ajouter le HasApiTokens trait au Utilisateur classe de modèle. Faisons cela comme le montre l'extrait suivant.

le HasApiTokens trait contient des méthodes d'assistance utilisées pour valider les jetons dans la demande et vérifier l'étendue des ressources demandées dans le contexte de l'utilisateur actuellement authentifié.

De plus, nous devons enregistrer les itinéraires fournis par la bibliothèque de passeports avec notre application Laravel. Ces routes seront utilisées pour les opérations OAuth2 standard telles que l'autorisation, la demande de jetons d'accès, etc..

Dans la méthode de démarrage du app / Providers / AuthServiceProvider.php fichier, enregistrons les itinéraires de la bibliothèque Passport.

… / ** * Enregistrez tous les services d'authentification / autorisation. * * @return void * / public function boot () $ this-> registerPolicies (); Passeport :: routes (); … 

Dernier point mais non le moindre, nous devons changer le api conducteur de jeton à passeport dans le config / auth.php fichier, car nous allons utiliser la bibliothèque Passport pour l'authentification par l'API.

'gardes' => ['web' => ['driver' => 'session', 'provider' => 'utilisateurs',], 'api' => ['driver' => 'passeport', 'provider' => 'utilisateurs',],],

Jusqu'ici, nous avons fait tout ce qui était nécessaire en ce qui concerne la configuration du serveur OAuth2..

Configurer les ressources de démonstration

Dans la section précédente, nous avons effectué tout le travail nécessaire pour configurer le serveur d'authentification OAuth2 dans notre application. Dans cette section, nous allons configurer une ressource de démonstration pouvant être demandée via l'appel de l'API..

Nous allons essayer de garder les choses simples. Notre ressource de démonstration renvoie les informations utilisateur à condition qu’il existe un code valide. uid paramètre présent dans le OBTENIR demande.

Créons un fichier de contrôleur app / Http / Controllers / UserController.php avec le contenu suivant.

get ("uid", 0); $ user = User :: find ($ user_id); return $ user; 

Comme d'habitude, vous devez également ajouter un itinéraire associé, que vous êtes censé ajouter dans la routes / web.php fichier. Mais ce dont nous parlons, c’est la voie de l’API, et elle a donc besoin d’un traitement spécial..

Les routes de l’API sont définies dans le routes / api.php fichier. Alors, allons-y et ajoutons notre route API personnalisée comme indiqué dans l'extrait suivant.

get ('/ user', fonction (Request $ request) return $ request-> user ();); // route de l'API personnalisée Route :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');

Bien que nous l’ayons défini comme / utilisateur / get, la route d'API efficace est / api / user / get, et c'est ce que vous devez utiliser lorsque vous demandez une ressource sur cette route. le api Le préfixe est automatiquement géré par Laravel, et vous n'avez pas à vous en préoccuper.!

Dans la prochaine et dernière section, nous verrons comment vous pouvez créer des informations d'identification de client et utiliser l'API OAuth2..

Comment utiliser les API OAuth2

Maintenant que nous avons configuré le serveur OAuth2 dans notre application, tout tiers peut se connecter à notre serveur avec OAuth et utiliser les API disponibles dans notre application..

Tout d'abord, les applications tierces doivent s'inscrire auprès de notre application pour pouvoir utiliser les API. En d'autres termes, elles sont considérées comme des applications client et recevront un identifiant client et un secret client lors de l'enregistrement.

La bibliothèque Passport fournit une commande artisanale permettant de créer des comptes clients sans souci. Allons-y et créons un compte client de démonstration.

$ php artisan passport: client À quel ID utilisateur attribuer le client ?:> 1 Comment nommer le client ?:> Démo Compte client OAuth2 Où devons-nous rediriger la demande après autorisation? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Nouveau client créé avec succès. Client ID: 1 Secret du client: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01

Quand tu cours l'artisan passeport: client commande, il vous pose quelques questions avant de créer le compte client. Parmi ceux-ci, il y en a un important qui vous demande la URL de rappel.

le URL de rappel est celui où les utilisateurs seront redirigés vers le tiers après autorisation. Et c'est là que le code d'autorisation censé être utilisé en échange du jeton d'accès sera envoyé. Nous sommes sur le point de créer ce fichier dans un instant.

Nous sommes maintenant prêts à tester les API OAuth2 dans l'application Laravel..

À des fins de démonstration, je vais créer le oauth2_client répertoire sous la racine du document en premier lieu. Idéalement, ces fichiers seront situés chez le tiers qui souhaite utiliser les API dans notre application Laravel..

Créons le oauth2_client / auth_redirection.php fichier avec le contenu suivant.

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

Assurez-vous de changer le identité du client et redirect_uri des paramètres reflétant vos propres paramètres, ceux que vous avez utilisés lors de la création du compte client de démonstration.

Ensuite, créons le oauth2_client / callback.php fichier avec le contenu suivant.

 'autorisation_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/ code ']); 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); result = curl_exec ($ ch) ch); $ response = json_decode ($ result); // vérifie si la réponse inclut access_token if (isset ($ response-> access_token) && $ response-> access_token) // vous souhaitez stocker le access_token dans la session quoique… $ access_token = $ response-> access_token; // utilise le jeton ci-dessus pour effectuer d'autres appels d'api dans cette session ou jusqu'à ce que le jeton d'accès expire $ 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); $ resultat = curl_e xec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); var_dump ($ result);  else // pour une raison quelconque, access_token n'était pas disponible // le débogage va ici

Encore une fois, veillez à ajuster les URL et les informations d'identification du client en fonction de votre configuration dans le fichier ci-dessus..

Comment ça marche tout à fait

Dans cette section, nous allons le tester complètement du point de vue de l'utilisateur final. En tant qu'utilisateur final, vous avez devant vous deux applications:

  1. Le premier est l'application Laravel pour laquelle vous avez déjà un compte. Il contient vos informations que vous pourriez partager avec d'autres applications tierces.
  2. Le second est l’application client tiers de démonstration., auth_redirection.php et callback.php, qui souhaite récupérer vos informations depuis l'application Laravel à l'aide de l'API OAuth.

Le flux commence à partir de l'application client tierce. Allez-y et ouvrez l'URL http: //localhost/oauth2_client/auth_redirection.php dans votre navigateur, ce qui devrait vous rediriger vers l'application Laravel. Si vous n'êtes pas déjà connecté à l'application Laravel, l'application vous demandera de le faire en premier lieu..

Une fois l'utilisateur connecté, l'application affiche la page d'autorisation..

Si l'utilisateur autorise cette demande, il sera redirigé vers l'application cliente tierce à l'adresse http: //localhost/oauth2_client/callback.php avec le message code comme le OBTENIR paramètre qui contient le code d'autorisation.

Une fois que l'application tierce reçoit le code d'autorisation, elle peut échanger ce code avec l'application Laravel pour obtenir le jeton d'accès. Et c’est exactement ce qu’il a fait dans l’extrait suivant de la oauth2_client / callback.php fichier.

$ ch = curl_init (); $ url = 'http: // your-laravel-site-url / oauth / token'; $ params = array ('grant_type' => 'code_autorisation', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1ssoT1X0u7sg0YWUW01', 'redirect_uri' '=>' http: , 'code' => $ _REQUEST ['code']); 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); result = curl_exec ($ ch) ch); $ réponse = json_decode ($ result);

Ensuite, l'application tierce vérifie la réponse de la demande CURL pour voir si elle contient un jeton d'accès valide..

Dès que l'application tierce obtient le jeton d'accès, elle peut utiliser ce jeton pour effectuer d'autres appels d'API afin de demander les ressources nécessaires à l'application Laravel. Bien entendu, le jeton d'accès doit être passé dans chaque requête demandant des ressources à l'application Laravel..

Nous avons essayé de reproduire le cas d'utilisation car l'application tierce souhaitait accéder aux informations utilisateur à partir de l'application Laravel. Et nous avons déjà créé un noeud final d'API, http: // your-laravel-site-url / api / user / get, dans l'application Laravel qui le facilite..

// vérifie si la réponse inclut access_token if (isset ($ response-> access_token) && $ response-> access_token) // vous souhaitez stocker le access_token dans la session bien que… $ access_token = $ response-> access_token; // utilise le jeton ci-dessus pour effectuer d'autres appels d'api dans cette session ou jusqu'à ce que le jeton d'accès expire $ 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, $ en-tête); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); var_dump ($ result); 

Voilà donc le flux complet de la manière dont vous êtes censé consommer les API OAuth2 de Laravel..

Et avec cela, nous avons atteint la fin de cet article.

Conclusion

Aujourd'hui, nous avons exploré la bibliothèque Passport à Laravel, ce qui nous permet de configurer très facilement un serveur OAuth2 dans une application.. 

Pour ceux d'entre vous qui débutent avec Laravel ou qui souhaitent développer leurs connaissances, leur site ou leur application avec des extensions, nous pouvons étudier de nombreuses choses sur le marché Envato..

N'hésitez pas à partager vos pensées et vos requêtes en utilisant le flux ci-dessous!