Laravel Passport Password Grant - Echec de l'authentification du client
Après avoir entendu beaucoup de choses sur laravel passeport, j'ai pensé à la mettre en œuvre dans mon nouveau projet où mon exigence est de créer une API qui sera utilisé dans une application mobile.
Donc mon application mobile est un client
qui aura encore ses utilisateurs.
J'ai suivi les étapes mentionné par Taylor et aussi lire à ce sujet ici. En un mot, j'ai suivi ces étapes:
- Installé
laravel/passport
. - Créé un site web de l'utilisateur.
- Généré passeport clés
php artisan passport:install
- Généré
client_id
etclient_secret
à l'aide dephp artisan passport:client
- Ajouté
redirection
etcallback
itinéraires enweb.php
- Autorisé de l'utilisateur et a obtenu le dernier jeton d'accès.
Puis j'ai essayé d'appeler api/user
( avec en-Tête Authorization
contenant la valeur Bearer eyJ0eXAiOiJKV1...(token)
J'ai reçu les données. Assez simple et soigné.
Mais mon app utilisateurs ne disposent pas de ces détails. Alors j'ai pensé à la configuration de Mot De Passe Accorder Des Jetons De qui s'intègre parfaitement dans mon exigence.
Maintenant commence la véritable casse-tête. J'ai essayé de le configurer pour les 3 derniers jours et en permanence faire
{"error":"invalid_client","message":"Client authentication failed"}
J'ai essayé presque tous les guide je l'ai suivi en ligne: Problèmes De RedirectionAjouter Au Moins Un Champ D'Application De La SolutionP100Y Problème etc.
Mais je suis encore en train invalid client
erreur. Voici ce que je suis en passant par FACTEUR pour oauth/token
:
{
"grant_type": "password,"
"client_id": "3,"
"client_secret": "8BUPCSyYEdsgtZFnD6bFG6eg7MKuuKJHLsdW0k6g,"
"username": "[email protected],"
"password": "123456,"
"scope": ""
}
Toute aide serait appréciée.
source d'informationauteur Kanav
Vous devez vous connecter pour publier un commentaire.
Vérifiez vos informations d'identification d'abord si elles sont correctes, d'autre part vérifier votre modèle de table qui utilise
\Laravel\Passport\HasApiTokens
trait de caractère que s'il contientemail
colonne, car par défaut il est utilisé pour identifier l'utilisateur lors de la validation des informations d'identification. si votre table ausername
colonne ou toute autre colonne qui est utilisé dans la validation des informations d'identification, vous devez définir une fonctionfindForPassport
dans ce modèle. comme ça,Je utiliser le nom d'utilisateur et le mot de passe de la colonne pour valider un utilisateur,
dans
{project_directory}\vendor\laravel\passport\src\Bridge\UserRepository.php
cette fonction valide vos informations d'identification,
avis la seconde si l'instruction et vous obtiendrez de savoir ce qui s'y passe.
espère que cela aide 🙂
Cela peut aider à vous diriger dans la bonne direction parce que nous mettons en œuvre le mot de passe de subvention de nous-mêmes.
1 - Sur votre étape 4 à la place de l'exécution de cette:
exécutez les opérations suivantes pour créer votre mot de passe subvention Client:
La commande ci-dessus va donner une réponse à la question de définir le nom de votre Mot de passe Subvention Client. Assurez-vous d'obtenir l'identifiant et le secret de ce nouvel enregistrement dans votre base de données.
2 - Votre FACTEUR Post objet de demande doit être encapsulé dans un objet semblable à la suivante:
Mise à jour de 1 10/12/2016:
Sur une enquête plus approfondie de cette question, j'ai couru dans le même endroit, vous y êtes et a été contraint de plonger dans le trou de lapin de passeport.
Actuellement à partir de ce que je vois, le système a mis l'identifiant client 'authorization_code" quand il a besoin d'être "mot de passe". Je suis à la recherche de la façon de résoudre ce problème que vous rencontrez que j'ai couru trop. Je vais poster le code pour aider les gens à suivre le long où j'ai été et ce que j'ai fait, mais il est 2:40 en suis, j'ai donc besoin d'un peu de sommeil.
Mise à jour 2 10/12/2016
Été débogage de la question pour 7 heures maintenant. Il s'agit d'une méthode à l'intérieur de passeport valide le client. Cette méthode prend les entrées que vous avez ajoutés dans l'objet (mentionné ci-dessus) et tente d'obtenir le Client Entité par l'intermédiaire d'un client de classe de référentiel basé sur ce que vous avez passée. Si un Client est trouvé, il sera ensuite vérifié pour voir si une instance de l'Entité Cliente existe au sein de l'Entité Cliente Interface qui RESSEMBLE, il tire ses informations d'identification du Client à partir de la base de données. Cependant, il y a un bloc de code qui renvoie la valeur NULL à Partir de ce que je reçois dans mes tests. TOUS les champs sont introduites correctement jusqu'à présent, mais il semble y avoir un mélange entre le référentiel et l'interface. Qui est à l'origine de l'erreur d'être jeté.
À la fin, je sens que je suis proche de la résolution de cette question. Votre patience est grandement apprécié. =)
Mise à jour 3 10/12/2016
Après une longue période de débogage, j'ai trouvé le problème initial. Il y avait des champs qui n'ont pas de correspondance. En bref, c'est un problème d'installation.
DONC
La solution dans ce cas est:
VÉRIFIEZ que TOUS les CHAMPS Dans la base de données avec TOUS informations d'identification qui est passée. Droit vers le bas pour des périodes, des tirets, des espaces de mots de passe, id de client, client secret, VALIDE redirect Uri/Url, grant_types, et étendues (si vous utilisez):
Assurez-vous que le client dans la base de données a un ENUM 1 sous la "password_client" colonne, si vous pas besoin d'en créer un à l'aide de l'mentionnées php artisan de commande ci-dessus, que je vais de référence ici:
Assurez-vous que le secret que vous êtes de passage dans les matches de ce qui est indiqué par le client dans votre base de données au caractère
Assurez-vous que l'id que vous êtes en passant matchs et est un type de données integer.
Assurez-vous que il ya un nom quelconque pour le client
Ne vous inquiétez pas à propos de la colonne user_id lors de l'utilisation de mot de passe subventions
assurez-vous que la voie est juste
Assurez-vous que l'e-mail de votre saisie (nom d'utilisateur) est un réel de l'utilisateur à l'intérieur de votre table des utilisateurs au sein de votre base de données (ou quelle que soit la table de la personnalisation de la laravel 5.3 système à l'accepter comme votre table users, je vais ajouter un lien sur la façon de personnaliser laravel 5.3 système à accepter un autre utilisateurs de table par défaut si besoin).
Assurez-vous que le grant_type est correctement orthographié
Assurez-vous que vous êtes préparé à accepter la réponse du porteur du jeton (sens de l'access_token et refresh_token).
Autre que cela, les premières mesures que j'ai décrites dans la partie ci-dessus de cette Réponse devrait vous remettre sur la bonne voie. Il y a d'autres ici qui fait mention d'une des étapes similaires qui sont utiles, mais l'adresse la même erreur qui est liée à une autre question (qui je suis sûr est le résultat d'un problème d'installation liées à leur programme de configuration du système).
J'espère que cela aide bien.
Ont yo essayez d'exécuter
php artisan config:cache
après tout, le passeport commandes.J'ai eu le même problème, et suis fixé par le réglage de base.auth-têtes, avec client_id comme nom d'utilisateur et le secret du mot de passe.
Puis il a bien fonctionné.
Essayez de créer un nouveau mot de passe client à l'aide de php artisan passeport:client --mot de passe
alors, plus probablement, un utilisateur ne sera pas attribué à ce mot de passe client. modifier la ligne de base de données et ajouter un exsting id utilisateur.
Espère que vous serez en mesure d'obtenir un jeton maintenant
J'ai réussi à obtenir le Laravel Passeport - Password_Grant_Token de travail par le biais de REPOS(comme FACTEUR de service), sans autres contrôleurs ou des middlewares. Voici comment j'ai réussi à le faire!
Installer par défaut Auth-les Échafaudages dans laravel la doc est ici
Installer le passeport la doc est ici
Inscrire un utilisateur à travers auth-les échafaudages
Goto REPOSÉ ou le FACTEUR, ou de tout autre service
Vérifier les données dans oauth_clients table pour votre form_params
Avec REPOSÉ par Request_body_form_data pas les en-têtes écrire la vôtre forms_params et envoyer une requête POST */oauth/jeton (url complète obligatoire)
(obligatoire form_params sont grant_type, client_id, client_secret, le nom d'utilisateur et mot de passe)
Vous devriez obtenir en retour un objet avec 4 touches (token_type, expires_in, access_token & refresh_token) et un statut de 200 OK.
Si tout à été un vrai succès pour l'instant...
Ouvrir un autre REPOSÉ fenêtre:
Envoyer une requête GET /api/utilisateur (à nouveau l'intégralité de l'url requise)
Dans les en-têtes d'écriture 2 paires nom-valeur (Accepter => application/json, Autorisation => Porteur ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST (à /oauth/jeton)
Et qui devrait être. Vous devriez obtenir un objet utilisateur comme réponse à partir de /api/utilisateur.
Vérifier la redirection/url) de callback lorsque le client est mis en place sur le passeport serveur. Vérifiez l'entrée où vous obtenez l'ID du client et secret que l'URL de Redirection est correcte.
J'avais la même erreur et a trouvé l'URL de Redirection n'était pas correct.
Il doit être dirigée vers le /de rappel de l'itinéraire (dans les exemples que Taylor donne)
signifie que le client_id et client_secret vous êtes en train d'envoi est l'une des opérations suivantes:
Que j'ai lu votre commentaire à certains de la réponse de ce fait un va de soi que vous utilisez le mauvais type de client_id et client_secret votre mot de passe subvention de flux, de sorte que votre cas était le dernier. Vous pouvez le vérifier en trouver l'entrée dans oauth_clients table pour votre fourni client_id et client_secret
dans votre oauth_clients table pour vérifier si votre fourni client_id et client_secret existe pour le mot de passe de la subvention de flux de dans votre serveur oauth. Et aussi, vous n'avez pas modifier manuellement le type de client par simple commutation de la valeur de cette colonne, vous devez créer un nouveau client pour le mot de passe type de subvention.
Cette commande va migrer les laravel/passeport fichier de migration de générer deux clients par défaut pour chaque type de laravel/passeport actuellement pris en charge. Vous pouvez également créer un client pour le mot de passe de la subvention de flux avec
Lorsque vous avez un nouveau client le mot de passe type de subvention, essayez de Poster à nouveau à l' /oauth/jeton pour générer un jeton avec votre nouveau client_id et client_secret
utiliser le code ci-dessous pour générer un jeton d'accès, il a travaillé pour moi avant:
Vérifiez soigneusement le Type de Subvention.
Dans l'exemple ci-dessus, il dit un mot de passe. Maintenant, vérifiez le tableau: oauth_clients
et assurez-vous que la valeur de la colonne
password_client = 1
ou recherchez l'entrée avec la
password_client = 1
J'ai été confrontée au même problème , j'ai eu la solution à partir de ce lien. Veuillez vérifier que.
https://github.com/laravel/passport/issues/71
Il est dit que :
Vous effectuez un appel à /oauth/jeton comme vous l'avez toujours pour obtenir votre jeton. Mais le faire avec un grant_type de custom_request. Vous aurez besoin d'ajouter un byPassportCustomRequest($request) méthode à votre Utilisateur modèle (ou quel que soit le modèle que vous avez configuré pour fonctionner avec le Passeport). Cette méthode accepte un Allume\Http\Demande et retourner le modèle de l'utilisateur si vous êtes en mesure d'authentifier l'utilisateur par l'intermédiaire de la demande, ou il retournera null.
vous pouvez définir deux variables comme
et la condition est dans votre fonction comme ceci