web-dev-qa-db-ja.com

Laravel Passport Password Grant Refresh Token

モバイルクライアントでLaravelのPassportを使用して頭を回そうとしています。 Password Grantタイプの認証は適切な方法のようですが、iOSアプリで機能しますが、トークンの更新を機能させることができません。

認証時にtokenrefresh tokenを取得して保存しますが、トークンの有効期限が切れると、oauth/token/refreshルートの呼び出しが機能しません。ルートはwebミドルウェアを使用しています。これは、apiルートを使用する私のアプリがそれにアクセスできないことを意味します。彼らがモバイルクライアントを決してリフレッシュしないように意図していたのか、それともあなたがあなた自身のリフレッシュをロールすることを望んでいたのか、私にはわかりませんか?これがどのように機能するかについて洞察があれば、それは素晴らしいことです。

7
Chris

oauth/token/refreshルートは、アクセストークンを更新するためのものではありません。これは、JavaScriptから独自のAPIを使用するときに使用される一時的なトークンを更新するために使用されます。

refresh_tokenを使用してアクセストークンを更新するには、oauth/tokengrant_typeを使用して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);

スコープに関する1つの注意点として、トークンを更新すると、元のアクセストークンと同一またはより狭いスコープしか取得できません。元のアクセストークンで提供されなかったスコープを取得しようとすると、エラーが発生します。

16
patricus

私は何かをしました。

  1. 更新トークンを付与するためのエンドポイントを作成しました。

そして私のコントローラーでは、

public function userRefreshToken(Request $request)
{
    $client = DB::table('oauth_clients')
        ->where('password_client', true)
        ->first();

    $data = [
        'grant_type' => 'refresh_token',
        'refresh_token' => $request->refresh_token,
        'client_id' => $client->id,
        'client_secret' => $client->secret,
        'scope' => ''
    ];
    $request = Request::create('/oauth/token', 'POST', $data);
    $content = json_decode(app()->handle($request)->getContent());

    return response()->json([
        'error' => false,
        'data' => [
            'meta' => [
                'token' => $content->access_token,
                'refresh_token' => $content->refresh_token,
                'type' => 'Bearer'
            ]
        ]
    ], Response::HTTP_OK);
}
1
usama muneer