J'essaie de comprendre comment utiliser le passeport de Laravel avec des clients mobiles. Le type d'authentification Grant de mot de passe semble être la voie à suivre, et je le fais fonctionner avec mon application iOS, mais je ne peux pas obtenir de rafraîchissement de jeton pour travailler.
Lors de l'authentification, j'obtiens un token
et un refresh token
que je stocke cependant à l'expiration du jeton, appelant le oauth/token/refresh
la route ne fonctionne pas. L'itinéraire utilise le middleware web
ce qui signifie que mon application utilisant l'itinéraire api ne peut pas y accéder. Je ne sais pas s'ils voulaient que les clients mobiles ne se rafraîchissent jamais ou s'ils voulaient que vous lanciez votre propre rafraîchissement? Si quelqu'un a un aperçu de la façon dont cela est censé fonctionner, ce serait formidable.
Le oauth/token/refresh
route n'est pas destiné à rafraîchir les jetons d'accès. Il est utilisé pour actualiser les jetons transitoires, qui sont utilisés lorsque vous utilisez votre propre API à partir de votre javascript.
Pour utiliser votre refresh_token
pour actualiser votre jeton d'accès, vous devez appeler le oauth/token
route avec le grant_type
de refresh_token
.
Voici l'exemple fourni par la documentation :
$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);
Une remarque sur les étendues, lorsque vous actualisez le jeton, vous ne pouvez obtenir que des étendues identiques ou plus étroites que le jeton d'accès d'origine. Si vous essayez d'obtenir une étendue qui n'a pas été fournie par le jeton d'accès d'origine, vous obtiendrez une erreur.
J'ai fait quelque chose comme ça.
et dans mon contrôleur,
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);
}