web-dev-qa-db-ja.com

Laravel Passport with Password Grant Tokensの使用方法?

https://laravel.com/docs/5.6/passport のドキュメントを読みましたが、誰かが私を助けてくれることを願っています:

最初に、いくつかのコンテキスト、Passportを使用して、モバイルアプリ(ファーストパーティアプリ)のOauth認証を提供します。

  1. _php artisan passport:client --password_を使用すると、クライアントIDとクライアントシークレットが返されます。この値はアプリで修正する必要がありますか?たとえば、ハードコーディングされたファイルや「設定」ファイルとして保存しますか?値を保存する必要がない場合、どのように機能しますか?

  2. 私のアプリにユーザーを登録するには、$user->createToken('The-App')->accessToken;を使用します。accessTokenはすべてのリクエストをヘッダーとして送信するために使用されるものです(Authorization => Bearer $ accessToken)。 -App」の値は?

  3. ログインするために、私はURLを使用しています: http://example.com/oauth/token とパラメーターとして送信:

    {"username": "[email protected]"、 "password": "userpassword"、 "grant_type": "password"、 "client_id":1、//コマンドから取得したクライアントID(質問1) "client_secret": "Shhh" //コマンドから取得したクライアントシークレット(質問1)}

  4. 以前のエンドポイントを使用してユーザーにログインすると、refresh_tokenが返されます。トークンを更新するには http://example.com/oauth/token/refresh を使用しましたが、リフレッシュエラー419が発生しました。csrf検証からURL oauth/token/refreshを削除し、_"message": "Unauthenticated."_を取得しました。次のリクエストを行っています。

    Content-Type:x-www-form-urlencoded grant_type:refresh_token refresh_token:the-refresh-token //コマンドから取得した更新トークン(質問3)client_id:1 //コマンドから取得したクライアントID (質問1)client_secret:Shhh //コマンド(質問1)スコープから取得したクライアントシークレット: ''

このエンドポイントを使用する必要がありますか?または私が開発しようとしているアプリを考えると必要ではありません。

  1. 最後に、パスポートから取得するエンドポイントはたくさんあります。たとえば、使用するとは思わないでしょう。_oauth/clients*_、_oauth/personal-access-tokens*_

ご協力ありがとうございました!

15
JohnnyAce

独自のapiを使用している場合、ユーザーログインで http://example.com/oauth/token を呼び出す必要はありません。アプリ側でclient_idとclient_secretを保存する必要があるためです。ログイン用のapiを作成すると、資格情報を確認してパーソナルトークンを生成できます。

_public function login(Request $request)
{
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // Authentication passed...
             $user = Auth::user();
             $token = $user->createToken('Token Name')->accessToken;

            return response()->json($token);
        }
}
_

最後に、パスポートから取得するエンドポイントはたくさんあります。たとえば、使用するとは思わないでしょう:oauth/clients *、oauth/personal-access-tokens *は、発行元のエンドポイントからそれらを削除する方法です。パスポート?

AuthServiceProviderからPassport::routes();を削除し、必要なパスポートルートのみを手動で配置する必要があります。 _oauth/token_ルートのみが必要だと思います。

「The-App」の価値とは何ですか?

oauth_access_tokensテーブルをチェックすると、名前フィールドがあります。 $user->createToken('Token Name')->accessToken;ここでは、「トークン名」が名前フィールドに格納されています。

Laravel Passport with Password Grant Tokensの使用方法?

パスワード付与トークンを生成するには、アプリ側で_client_id_および_client_secret_を保存する必要があり(推奨されません this を確認してください)、_client_secret_をリセットする必要がある場合古いバージョンのアプリが機能しなくなると、これらが問題になります。パスワード付与トークンを生成するには、ステップ3で述べたようにこのAPIを呼び出す必要があります。

_$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => '[email protected]',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

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

_refresh_token_からトークンを生成します

_$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],
]);

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

これを見ることができます https://laravel.com/docs/5.6/passport#implicit-grant-tokens too。

26
rkj

質問5への取り組み

最後に、パスポートから取得するエンドポイントはたくさんあります。たとえば、使用するとは思わないでしょう。_oauth/clients*_、_oauth/personal-access-tokens*_


Passport::routes($callback = null, array $options = [])は、オプションの_$callback_関数とオプションの_$options_引数を取ります。

コールバック関数は_$router_引数を取ります。この引数から、_AuthServiceProvider.php_で以下に示すように、インストールするルートを選択できます。これにより、より詳細な構成が可能になります。

_Passport::routes(function ($router) {
    $router->forAccessTokens();
    $router->forPersonalAccessTokens();
    $router->forTransientTokens();
});

Passport::tokensExpireIn(Carbon::now()->addMinutes(10));

Passport::refreshTokensExpireIn(Carbon::now()->addDays(10));
_

この方法では、必要なパスポートルートのみを作成します。

forAccessTokens();アクセストークンを作成できるようにします。
forPersonalAccessTokens();この記事ではこれを使用しませんが、個人トークンを作成できるようにします。最後に、forTransientTokens();トークンを更新するためのルートを作成します。

_php artisan route:list_を実行すると、Laravel Passportによってインストールされた新しいエンドポイントを見ることができます。

_| POST | oauth/token         | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken
| POST | oauth/token/refresh | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh
_
0
Dan White