モバイルクライアントでLaravelのPassportを使用して頭を回そうとしています。 Password Grantタイプの認証は適切な方法のようですが、iOSアプリで機能しますが、トークンの更新を機能させることができません。
認証時にtoken
とrefresh token
を取得して保存しますが、トークンの有効期限が切れると、oauth/token/refresh
ルートの呼び出しが機能しません。ルートはweb
ミドルウェアを使用しています。これは、apiルートを使用する私のアプリがそれにアクセスできないことを意味します。彼らがモバイルクライアントを決してリフレッシュしないように意図していたのか、それともあなたがあなた自身のリフレッシュをロールすることを望んでいたのか、私にはわかりませんか?これがどのように機能するかについて洞察があれば、それは素晴らしいことです。
oauth/token/refresh
ルートは、アクセストークンを更新するためのものではありません。これは、JavaScriptから独自のAPIを使用するときに使用される一時的なトークンを更新するために使用されます。
refresh_token
を使用してアクセストークンを更新するには、oauth/token
のgrant_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つの注意点として、トークンを更新すると、元のアクセストークンと同一またはより狭いスコープしか取得できません。元のアクセストークンで提供されなかったスコープを取得しようとすると、エラーが発生します。
私は何かをしました。
そして私のコントローラーでは、
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);
}