web-dev-qa-db-ja.com

laravelパスポートクライアントアプリでアクセストークンを使用してユーザーデータを取得する

server.appclient.appを作成しましたLaravel Passport documentationを使用しました。すべてが期待どおりに機能します。

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'];
});

デフォルトでは、このルートはaccess_tokenを返します。

リクエスト:

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

戻り値:

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

質問:

server.appに正しいリクエストを行う方法client.appで指定されたaccess_tokenを使用して、たとえばser(s)email(s)を取得します。

使用する必要があります:http://server.app/api/userデータ取得のリクエスト?はいの場合、どうすればそれができますか?可能であれば、コードを書いてください。

答えてくれてありがとう。

16
Tauras

私はこの問題について絶対に狂っています! /api/userなどのルートにアクセスしようとしたときに、なぜ愚かなUnauthenticatedエラーを吐き出し続けたのかについては、まったくおかしくありませんでした。多くの検索(MUCH検索)の後、最終的に答えを見つけました。 Laracastsからこのフェロを見たら、あなたは私のヒーローです!

app\Providers\RouteServiceProvider.phpを確認しましたか?

mapApiRoutes()では、ミドルウェアを設定できます。 auth:apiを確認してください。そうでない場合は、変更します。また、ルートapi.phpファイルからauthmiddlewareを削除します。

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

編集:

上記のapp\Providers\RouteServiceProvider.phpに変更を加えたら、次の例に進みます。

まず最初に、新しいaccess_tokenを取得する必要があります。これを行うには、passwordgrant_type(詳細: https://laravel.com/docs/5.4/passport #password-grant-tokens

新しいaccess_tokenを取得するために、routes/web.phpに新しいルートを作成し、/connectと呼びました。次に、上記のリンクからのコードをそこに配置しました:

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);
});

Chrome Postman を使用して、以下を行う必要があります。

  1. メソッドをGETに設定します
  2. 関連するパラメータで接続URLを入力します http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
  3. headersタブをクリックし(Authorizationの横にあります)、Acceptのキーとapplication/jsonの値を追加します
  4. 送信ボタンを押す

結果の例:

{
  "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="
}

access_token文字列を強調表示して、テキストエディターにコピーします。

その後、routes/api.phpに新しいルートを作成する必要があります。以下のルートは、単に現在のAPIユーザーの情報を出力します。

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

上記を完了したら、Postmanにこれらの変更を加えます。

  1. メソッドをGETに設定します
  2. APIルートを指すようにURLを変更します http://example.com/api/user
  3. headersタブをクリックし、Authorizationの新しいキーとBearer access_token_hereの値を追加します(access_token_hereを以前にコピーしたアクセストークンに置き換えます)
  4. 送信ボタンを押す

出力例:

{
  "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

POSTMAN chromeアプリで実行してみましたか?そうでない場合はダウンロードしてください。 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en

情報を入力します。 enter image description here

データが正常に生成されたら、右上の[CODE]ボタンをクリックします(緑色で強調表示しました)。

最後に、言語を選択してコードをコピーします。 PHPの場合、php cURLを選択しました。

それがうまくいくことを願っています。

5
Vandolph Reyes

Laravel ドキュメント に従って、サーバーアプリにルートを追加する必要があります(_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');
_

Quzzle経由でリクエストを行う:

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