web-dev-qa-db-fra.com

Obtenir les données utilisateur en utilisant le jeton d’accès dans laravel application client passeport

J'ai créé avec succès server.app et client.app en utilisant documentation de Laravel Passport. Tout fonctionne comme prévu.

client.app Route:

Route::get('callback', function (Request $request) {
   $http = new GuzzleHttp\Client;
   $response = $http->post('http://server.app/oauth/token', [
    'form_params' => [
        'grant_type' => 'authorization_code',
        'client_id' => 3,
        'client_secret' => 'secret',
        'redirect_uri' => 'http://client.app/callback',
        'code' => $request->code
    ]
   ]);
   return json_decode((string) $response->getBody(), true)['access_token'];
});

Par défaut, cette route retourne access_token, avec lequel je peux faire ce que je veux.

Demande:

http://server.app/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fclient.app%2Fcallback&response_type=code&scope=

retourne:

http://client.app/callback?code=access_token

Question:

Comment faire une demande correcte à server.app avec donné access_token dans client.app pour obtenir par exemple email (s) d'utilisateur (s).

Devrais-je utiliser: http://server.app/api/user demande pour obtenir des données? Si oui, comment puis-je faire ça? Si possible, veuillez écrire un code.

Merci pour toutes les réponses.

16
Tauras

Je suis devenu complètement fou à propos de cette question! Cela ne donnait aucune idée de la raison pour laquelle il n'arrêtait pas de cracher l'erreur stupide Unauthenticated en essayant de modifier un itinéraire tel que /api/user. Après beaucoup de recherches (BEAUCOUP de recherche), j'ai finalement trouvé la réponse. Si vous voyez ce fero de Laracasts, vous êtes mon héros!

Avez-vous vérifié app\Providers\RouteServiceProvider.php?

dans la mapApiRoutes(), vous pouvez définir le middleware. vérifiez que son auth:api. si ce n'est pas le cas, changez-le. supprimez également le fichier auth middleware du fichier route api.php.

https://laracasts.com/discuss/channels/laravel/laravel-53-passport-api-unauthenticated-in-postman-using-personal-access-tokens

Edit:

Une fois que vous avez modifié le app\Providers\RouteServiceProvider.php Mentionné ci-dessus, continuez avec l'exemple ci-dessous.

Tout d’abord, nous devons récupérer un nouveau access_token. Pour ce faire, j'utilise le mot de passegrant_type (Plus d'informations: https://laravel.com/docs/5.4/passport#password-grant -tokens )

Pour récupérer un nouveau access_token, J'ai créé un nouvel itinéraire sur routes/web.php Et je l'ai appelé /connect. J'ai ensuite placé le code du lien ci-dessus dans celui-ci:

Route::get('connect', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://example.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => $request->client_id,
            'client_secret' => $request->client_secret,
            'username' => $request->username,
            'password' => $request->password,
            'scope' => ''
        ],
    ]);

    return json_decode((string) $response->getBody(), true);
});

Avec Chrome Postman , vous devez:

  1. Définissez la méthode sur GET
  2. Entrez l'URL de connexion avec les paramètres appropriés, c'est-à-dire http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]=123456
  3. Cliquez sur l'onglet en-têtes (à côté de l'autorisation), ajoutez une clé de Accept et une valeur de application/json
  4. Appuyez sur le bouton Envoyer

Exemple de résultat:

{
  "token_type": "Bearer",
  "expires_in": 31535999,
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImE0MmFiYjZkNTQ5M2ZjMGQxYzVmM2E3MDFlOTNjMTRlOTQxMTBmNWQ5NmI1ODI0NTBmMmEyM2MwMzQ5OTMwODdiZGUwYTI5ZDU5N2VjYTExIn0.eyJhdWQiOiIxIiwianRpIjoiYTQyYWJiNmQ1NDkzZmMwZDFjNWYzYTcwMWU5M2MxNGU5NDExMGY1ZDk2YjU4MjQ1MGYyYTIzYzAzNDk5MzA4N2JkZTBhMjlkNTk3ZWNhMTEiLCJpYXQiOjE0OTE0Njg4ODIsIm5iZiI6MTQ5MTQ2ODg4MiwiZXhwIjoxNTIzMDA0ODgxLCJzdWIiOiI3NWNlZDUwMC0xNTQ0LTExZTctOWE4ZS1hZDVmMWFlZTM4OWUiLCJzY29wZXMiOltdfQ.dV3DKDM7IN-oGnZ_Rw10VnYkh9ySlz5i859yO0roZLAYwgmsmEEZK_vpttudUoKmYenqibZQXg6HG4KHRd-cgas_2DpO-7UCkXQYNTriUUAQ4XM6To86EOaf2BW1a07kdVGXTdo_ETQc7heUG0NWQ8-Hrr2NHkSyDULupDs8gDg_fg6xSVsFUEDZB32UIGwquAHT1Y21ZpTdQar0Rag9qOLeZYTR05ro0v9_rQbSoDgJiZE3KT9GbqwU_BegWRmAwY6LmxG4raZpSMgqYEMo3D9D0lJiomOLK4pSjqmi0EVti04zZ6Vg4GHE6S1TgC6IlakV2bMItXTWuZT6T0jEba-3ctaC4K2T8F4P8J6t-99mKY-_zSwgfGm1FErK09qixJlZ4zFsCCT7MgNQVoyu7GkJdTJVlpL1QXLc1QhfrtW11a4gg4Nlja_VyRdB9fZHomgMLpvm_HvSlqEvpeWb8wGkCts9w7ivSNLim-LuFgswGNhTZZqLEbuwB6sJV-l1V0MJCq7_h0yTmLlBdoUkxCaDJJvkUSLk0MUaalAAzY1OCxm-tJcKn31m4yOwf25ZDWf8tWuOTKarEbFyxjB0elkxXQXGe7J7TJAg0tuIEQ8YTL3ExJQ6I7zwtCL83bPOWYRGlJrsX6Lsf0qB-xMVD2DzA3JKDKvZTp5x92kP821",
  "refresh_token": "ArOWW0glHjflLpL4fKOsrNUXT5v91u+CjwcE8LBvH7GJsaM0gWaFe8GH9zXjh8SHew+cg7v1IMiIPLYSVdf7h8oOeV7wgwjChI9YM0Kt6iE4wOXJuy0VwPSCj+danHDuWC3nJWYLrPydTE3h/jgFNjWEPfgXGLfiRWjWQMozddz5EWd4pvUI7J64Lw6cMCg/BslZLHtfN7IWoC1RQGp5K0cGO0QmZfsGMSzsoSUNFjv16BXiKSqlNvs5aGhxErFY4wEOKqBifXUkb3SwnK/iHKg3irmqj4fOf/aKNyCdd/PJCHrRPocrW83oM1sjq7eDufEIlgxmy7uRset8GLAWjx/n6rzkxz2QM0/9Lyc/XN9OL00XBYjA47a1wL55qUUUYWevaFwxWX8LG2UjBf9Vv2lfvLcBBkbgqpalePMDh6wb8IDyJek4BbvZtJ1VZ/l+A9XXY9rQt/hIDdoOAtib8CGr9/CERFIrByZa3TEJBCLAa2FvJSIhHVnKvnuvZX3e9qhTkgHqowJrWg2C3VyPDQYAdIhdpTEvs0pcGSAZWhwXfu9xKQOeyRTEScbLKQmuW+sGbwU+qfdLgh/BR5kW4TMer4TIzWKSuHsqmibgiUwaQkwTrtjH2Xz9Z9XmAbVzJ8pqbEZPe7t5whXDoRSnAwWymdxk2E7SiSsVUA3kX39="
}

Mettez en surbrillance la chaîne access_token Et copiez-la dans un éditeur de texte.

Vous devrez ensuite créer un nouvel itinéraire dans routes/api.php. L'itinéraire ci-dessous générera simplement les informations des utilisateurs actuels de l'API:

Route::group(['prefix' => 'user'], function() {
    Route::get('/', function() {
        return response()->json(request()->user());
    });
});

Une fois que vous avez fait ce qui précède, apportez ces modifications à Postman:

  1. Définissez la méthode sur GET
  2. Modifiez l'URL pour qu'il pointe vers la route de l'API, c'est-à-dire http://example.com/api/user
  3. Cliquez à nouveau sur l'onglet en-têtes et ajoutez une nouvelle clé de Authorization et une valeur de Bearer access_token_here (Remplacez access_token_here Par le jeton d'accès que vous avez copié plus tôt)
  4. Appuyez sur le bouton Envoyer

Exemple de sortie:

{
  "id": "75ced500-1544-11e7-9a8e-ad5f1aee389e",
  "name": "test test",
  "email": "[email protected]",
  "created_at": "2017-03-30 23:29:03",
  "updated_at": "2017-03-30 23:29:03"
}
35
adamj

Avez-vous essayé de l'exécuter sur POSTMAN chrome app? Sinon, téléchargez-le. https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomopodhd

Remplissez les informations. enter image description here

Une fois les données générées, cliquez sur le bouton CODE en haut à droite (je l’ai surligné en vert).

Enfin, sélectionnez votre langue et copiez le code. Pour PHP, j'ai sélectionné php cURL.

Esperons que ça marche.

5
Vandolph Reyes

Selon Laravel documentation , vous devez ajouter un itinéraire à une application serveur (routes/api.php): $response->getBody();

Route::get('/user', function () {
    // authenticated user. Use User::find() to get the user from db by id
    return app()->request()->user();
})->middleware('auth:api');

Faire une demande via quzzle:

$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);
echo $response->getBody();
3
shukshin.ivan