Le passeport 5.3 de Laravel et les routes api
Je suis en utilisant le Framework Laravel version 5.3.9, frais de téléchargement de rien ajouté sur via composer(à l'exception de "laravel/passport": "^1.0"
).
J'ai fait toutes les choses que suggéré dans le docs. Les Tables sont créées, les routes sont en place, tout fonctionne bien. Cependant j'ai besoin de passeport pour une API.
Mes parcours ressemble à:
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/v1/users/register | api::users::register | App\Http\Controllers\Api\V1\SocialController@register | api,auth |
| | POST | oauth/authorize | | \Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve | web,auth |
| | GET|HEAD | oauth/authorize | | \Laravel\Passport\Http\Controllers\AuthorizationController@authorize | web,auth |
| | DELETE | oauth/authorize | | \Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny | web,auth |
| | GET|HEAD | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@forUser | web,auth |
| | POST | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@store | web,auth |
| | PUT | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@update | web,auth |
| | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth |
| | GET|HEAD | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser | web,auth |
| | POST | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store | web,auth |
| | DELETE | oauth/personal-access-tokens/{token_id} | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy | web,auth |
| | GET|HEAD | oauth/scopes | | \Laravel\Passport\Http\Controllers\ScopeController@all | web,auth |
| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | |
| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
| | GET|HEAD | oauth/tokens | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth |
| | DELETE | oauth/tokens/{token_id} | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
Tous les web
itinéraires sont là, il n'y a pas api
liées routes, depuis Passeport ne pas fournir quoi que ce soit de sortir de la boîte.
L'API en elle-même est destiné à être utilisé par un client de confiance, c'est fait pour une application mobile qui nécessite un login cependant, dit que la connexion sera de contourner quelques étapes.
Une fois qu'un utilisateur l'accès au /register
route, le processus d'enregistrement lui-même est assez simple: l'accès de l'utilisateur, facebook compte un prendre un peu de champs - mail, facebook id, nom d'une photo de profil et à partir de là, les utilisateurs est considéré comme enregistré. Mais l'utilisateur PAS connexion avec facebook(ce qui est un aspect très important). Le consommateur de l'application sera délivré un jeton et utiliser le jeton d'accéder à divers paramètres de l'api(qui nécessitent un jeton à utiliser).
De sorte qu'il se résume à ceci. J'ai besoin d'émettre un jeton d'accès pour le consommateur application que l'accès à l'API. L'API en elle-même n'ont qu'un seul client, c'est l'application mobile lui-même. Les utilisateurs qui utilisent l'application ne sont pas considérés comme des clients de l'API, mais les clients de l'application mobile lui-même.
Jusqu'à présent, le Passeport est un mal de tête à travailler avec quand il s'agit de la mise en œuvre de l'API liées à des trucs, c'est ça ou je ne peux pas comprendre comment le faire fonctionner correctement.
J'ai créé un client de test dans le oauth_clients
table qui ressemble à ceci:
Je suis en utilisant le Facteur de l'accès api/v1/users/register
l'itinéraire le auth
middleware avec le suivant JSON application/json
{
"grant_type" : "authorization_code",
"client_id" : 5,
"client_secet": "y5dvPIOxQJOjYn7w2zzg4c6TRrphsrNFWbG4gAUL"
}
Qui, bien sûr, le résultat sera une
{"error":"Unauthenticated."}
Il a le sens parfait.
Par pure curiosité, j'ai changé le /register
itinéraire:
Route::group([
'middleware' => [
],
], function ()
{
Route::group([
'prefix' => 'users',
'as' => 'users::',
], function ()
{
// Route::get('/register', ['as' => 'register', 'uses' => 'Api\V1\SocialController@register',]);
Route::post('/register', ['as' => 'register', 'uses' => '\Laravel\Passport\Http\Controllers\AccessTokenController@issueToken',]);
});
});
Avec la même json
comme avant. Qui a abouti à {"error":"invalid_client","message":"Client authentication failed"}
.
J'ai traqué la fonction qui, je pense, s'occupe de la validateClient
partie dans vendor/ligue
oauth2-serveur/src/Subvention/AbstractGrant`.
La $client
est null. Maintenant, cela peut ou peut ne pas être liée à Passeport, étant donné que la documentation sur elle plutôt qui manque et la pensée de creuser à travers un monstre d'un paquet de traquer l'erreur qui peut être en grande partie en raison pour moi de ne pas faire quelque chose de bien ne me frappe pas comme une bonne idée, je suis d'options. Pour être parfaitement honnête, je ne sais même pas quel est le problème.
Vraiment, à ce point de toute sorte dans la bonne direction est plus que bienvenue.
La partie en question est
source d'informationauteur Andrew
Vous devez vous connecter pour publier un commentaire.
Le problème avec Laravel 5.3 passeport est que, contrairement à la précédente OAuth 2.0 Serveur pour Laravel bibliothèque proposée par lucadegasperi, il n'a pas d'API pour réaliser directement les clients. Comme si maintenant, le client peut uniquement être effectué par le biais du front-end. Pour info nous avons voulu utiliser laravel passeport uniquement pour notre application pour téléphone mobile lors de la création et de l'inscription de l'utilisateur, nous aurions seulement e-MAIL & Mot de passe et dans certains cas seulement Facebook UserID pour facebook connexion. Donc, l'approche suivante a fonctionné assez bien pour notre cas et peut varier en fonction de votre scénario, mais peut vous aider dans le long terme, de jouer avec laravel passeport.
Remarque: Avant de suivre les dessous de son supposé que vous avez activé le Mot de passe de Subvention dans votre application.
Donc la façon dont nous l'avons résolu pour notre projet sur laravel 5.3 est comme suit:
dans le oauth_clients convertir le champ id dans un champ normal c'est à dire enlever comme étant la clé primaire et de faire le type de données varchar, de sorte que l'on peut stocker l'adresse de courriel que client_ids comme ils sont également unique pour votre système. En cas de Facebook login nous store Facebook Id d'utilisateur ici, dans cette colonne qui va encore être unique pour chaque client. Aussi pour d'autres tables comme: oauth_access_tokens, oauth_auth_codes & oauth_personal_access_clients changement client_id VARCHAR(255), de sorte qu'il peut stocker des adresses e-mail ou Facebook Id Utilisateur.
Maintenant, allez à vos modèles, et de créer un modèle pour oauth_clients une table de sorte que vous pouvez créer un client par programme à partir du code lors de la création des utilisateurs.
Puis dans votre api.php itinéraire fichier ajouter le parcours suivant:
Dans l'extrait de code ci-dessus, vous devez noter que pour générer le oauth_client secret, vous devez utiliser une formule forte de chiffrement que vous vous sentez à l'aise de l'utiliser avec votre application. Aussi, utiliser la même technique pour générer la clé secrète sur votre application mobile pour le client/utilisateur.
Maintenant, vous pouvez utiliser le POSTE standard API offerte par laravel passeport pour demander un jeton d'accès par mot de passe de subvention à l'aide de "oauth/jeton" en utilisant les paramètres suivants:
Ci-dessus vous donnera une réponse, si tout est correct, similaires à :
Son seulement une solution temporaire jusqu'à laravel prend en charge une API externe pour les applications qui ne dispose que d'un mobile comme la seule interface pour la création d'oAuth les clients et les utilisateurs.
Espère que cela vous aide!
Des acclamations.
Parce que l'marqué réponse a été noté que correct, je sens qu'il faut noter certains points clés qui sont nombreux, je pense, d'accord avec:
Vous presque JAMAIS souhaitez mettre serveur logique de processus de ce type au sein de votre itinéraires répertoire. Surtout lorsque l'on travaille à créer une API avec l'intention de le mettre en production. C'est un sale route à prendre et n'est pas entièrement sûr.
SAUF c'est pour des choses qui sont sûres de processus au sein de votre itinéraires répertoire. Comme, sur une moindre échelle, la base de la logique pour l'envoi d'une notification (SMS,email,push,mou) pour les membres du personnel à propos d'une nouvelle lettre/blog/mémo publié comme un exemple.
TOUJOURS tentative d'exploiter et d'utiliser autant d'un cadre de fonctionnalités que possible avant de tenter de "hackishly" accomplir une tâche qui peut avoir été réalisé à plusieurs reprises avant de.
De s'assurer que vous êtes en train de faire la bonne recherche à propos de quelque chose qui a été déjà accompli. De cette façon, il est plus facile de simplement référence à une vidéo ou un tutoriel qui montre comment bien faire ce que quelqu'un est en train de faire.
Cela étant dit, un bon point de départ serait de regarder la vidéo suivante qui décrit parfaitement les rudiments de la façon de configurer correctement ce que vous cherchez à mettre en place:
https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/13
À de nombreux égards, le tutoriel vidéo est très bien faite et complète du début à la fin. Assurez-vous de la brosse sur les différents Grant_Types pour OAuth2.0 en tant que bien de sorte que vous aurez une meilleure compréhension de ce type spécifique que vous/de votre application en fonction de votre application de mesure d'utiliser l'api:
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
En outre, assurez-vous d'UTILISER laravel de dehors-de-le-boîte de fonctionnalités pour la connexion et vous inscrire lors de la création ou de l'exploitation forestière dans les utilisateurs. Les Contrôleurs sont conçus pour vous lorsque vous effectuez les opérations suivantes dans votre console:
Outre que, si le passeport est ce un mystère, vous pouvez toujours tirer dans laravel/socialite paquet (https://github.com/laravel/socialite). Il va vous permettre de "se Connecter avec (Réseau Social Ici)". Fourni c'est la voie que vous êtes aussi dans le but d'aller.
La NOTE de FIN: La pièce que j'ai vu dans votre question qui a frappé le plus était la façon dont une personne va s'inscrire mais ne sera pas vous connecter avec facebook. Au lieu de cela aura un jeton d'accès à frapper les différentes API des points de terminaison. Donc si je suis ce que vous dites de droite, vous êtes visant à utiliser les données d'un utilisateur de facebook lorsque les données sont renvoyées, l'utilisateur est considéré comme connecté et doit être délivré un jeton d'accès. DONC:
Utilisation mondain à envoyer une "connexion avec facebook" demande à facebook. Cela permet d'obtenir des données de l'utilisateur et de l'effet de levier un peu de facebook du processus d'authentification.
Lorsqu'une demande est renvoyée avec les données de l'utilisateur à l'intérieur du corps à travers une vérification pour s'assurer qu'il existe des données (un simplement si la déclaration doit être fine). Depuis facebook ont déjà authentifié l'utilisateur et les informations d'identification que vous devrait être bon d'aller.
Vous pouvez déclencher un proxy interne au sein de votre Connexion Contrôleur (qui est la plus propre et la plus sûre façon de le faire) ou vous pouvez émettre un JWT (ce Qui est couvert dans les 5 dernières minutes de la vidéo postée dans cette réponse ci-dessus).
Ci-dessous est un exemple de code pour obtenir vous avez commencé.
App\Http\Controllers\Auth\LoginController.php
Le code ci-dessus est utilisé EN CAS vous êtes visant à obtenir le Mot de passe de Subvention type d'authentification des clients par l'entremise de passeport. Cependant, je serais vraiment regarder le tutoriel vidéo avant de sauter le pistolet sur quoi que ce soit. Il vous aidera beaucoup avec laravel 5.3 avec passeport.