web-dev-qa-db-ja.com

Laravel Passportで認証済みユーザーを取得し、パスワードを付与する

私はAPIをしましたREST with Laravel=そして今私はそれを消費しようとしています。APIでユーザーを認証する必要があり、私は使用しています パスワードの付与 メソッド。ユーザーを正しく認証でき、アクセストークンを取得できますが、それ以降、使用中のアプリケーションでアクセストークンを使用して認証済みユーザーを取得する方法がわかりません。

私はこのようなルートでAPIで試しました:

Route::get('/user', function(Request $request) {
    $user = $request->user();
    // Even with
    $user = Auth::user();

    return $user;
});

サイコロなし。 Passportコードを読んでいますが、理解できません。私の推測では、Laravel Passportはこの種類の許可タイプに1つを提供しているようには見えないので、新しいガードタイプまたは何かを指定する必要があります...

物事を明確にするには:

  • APIがありますRESTアプリケーション、oAuth2サーバーです。
  • API RESTを使用する別のアプリケーションがあります。
  • 私はワークフローを知っています。私の場合、Password Grantを使用して、コンシューマアプリケーションでユーザー資格情報を取得し、grant_typetopasswordを指定して/ oauth/tokenにリクエストを行います、「php artisan passport:client --password」で生成されたと確信しているユーザー資格情報とクライアント資格情報を提供します(注意してください-パスワードオプション)
  • アクセストークンを問題なく取得できます。今必要なのは、認証したばかりのユーザーのJSON表現をAPI RESTから取得することです。しかし、ここに問題があります:私はちょうどアクセストークンを持っています。ユーザーと関わりのあるものは何もありません。

または私はできますか?おそらく、パスワード付与要求を認証するメソッドを拡張して、生成されたアクセストークンを認証中のユーザーに関連付けることができます... *電球が点灯します*

アプリケーションテストコードの消費:

try {
    $client = new Client();
    $result = $client->post('https://myapi.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => '5',
            'client_secret' => 'my_secret',
            'username' => 'user_I_am_authenticating',
            'password' => 'the_user_password',
            'scope' => '',
        ]
    ]);
    $access_token = json_decode((string) $result->getBody(), true)['access_token'];
    $result = $client->get('https://myapi.com/client/user', [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => "Bearer $access_token",
        ]
    ]);

    return (string) $result->getBody();
} catch (GuzzleException $e) {
    return "Exception!: " . $e->getMessage();
}

https://myapi.com/client/userrouteは、APIでテストするために作成した単なるルートであることに注意してください。そのルートは次のように定義されます:

Route::get('/user', function(Request $request) {
    return $request->user();
});

今。私はこれが機能していないことを知っています。これが私が達成したいことです。 access_token/bearer_tokenを指定して、リクエストを行っているユーザーを把握します。

ありがとう。

15
Asier Paz

適切なミドルウェアを忘れました。

Route::get('/user', function(Request $request) {
    return Auth::user();
})->middleware('auth:api');

authミドルウェアに言及しない場合、認証フローは起動されません。 nullを取得する理由です。

17
Syl

あなたにも同じ問題がありました。そして、私は手動で認証ガードを定義した後にそれを解決しました。

Route::get('/user', function (Request $request) {
  return auth()->guard('api')->user();
});
12
Nurul Huda

リクエストごとにアクセストークンを返す必要があります。この部分のドキュメントを確認してください here

3
Mina Abadir