web-dev-qa-db-fra.com

Laravel Jeton d'actualisation d'octroi de mot de passe de passeport

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.

7
Chris

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.

16
patricus

J'ai fait quelque chose comme ça.

  1. Création d'un point de terminaison pour le jeton d'actualisation de la subvention.

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);
}
1
usama muneer