web-dev-qa-db-fra.com

Obtenez un utilisateur authentifié avec Laravel Passport and grant password

J'ai fait une API REST avec Laravel et maintenant j'essaie de la consommer. Le problème est que je dois authentifier les utilisateurs dans l'API et j'utilise la méthode Password Grant . Je peux authentifier les utilisateurs correctement et je peux obtenir un jeton d'accès mais à partir de là, je ne vois pas de moyen de récupérer l'utilisateur authentifié avec le jeton d'accès dans mon application consommatrice.

J'ai essayé dans l'API avec un itinéraire comme celui-ci:

Route::get('/user', function(Request $request) {
    $user = $request->user();
    // Even with
    $user = Auth::user();

    return $user;
});

Pas de dé. Je lis le code du passeport mais je ne peux pas le comprendre. Je suppose que je devrais spécifier un nouveau type de garde ou quelque chose parce qu'il ne semble pas que Laravel Passport en fournit un pour ce type de type de subvention ...

Pour clarifier les choses:

  • J'ai une API REST application, qui est le serveur oAuth2.
  • J'ai une autre application consommant l'API REST.
  • Je connais le workflow. Dans mon cas, avec Password Grant, j'obtiens les informations d'identification de l'utilisateur dans mon application client, puis je fais une demande à/oauth/token en spécifiant le grant_type à mot de passe , je fournis les informations d'identification de l'utilisateur ainsi que les informations d'identification de mon client, dont je suis sûr qu'elles ont été générées avec " php artisan passport: client --password "(notez l'option --password)
  • Je peux obtenir le jeton d'accès sans aucun problème. Ce dont j'ai besoin maintenant, c'est d'obtenir une représentation JSON de l'utilisateur que je viens d'authentifier à partir de l'API REST. Mais voici le problème: j'ai juste un jeton d'accès. Rien que je puisse rapporter à l'utilisateur.

Ou puis-je? Je peux peut-être étendre la méthode qui authentifie les demandes d'octroi de mot de passe pour relier le jeton d'accès généré à l'utilisateur qu'il authentifie ... * l'ampoule s'allume *

Code de test de l'application consommatrice:

try {
    $client = new Client();
    $result = $client->post('https://myapi.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => '5',
            'client_secret' => 'my_secret',
            'username' => 'user_I_am_authenticating',
            'password' => 'the_user_password',
            'scope' => '',
        ]
    ]);
    $access_token = json_decode((string) $result->getBody(), true)['access_token'];
    $result = $client->get('https://myapi.com/client/user', [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => "Bearer $access_token",
        ]
    ]);

    return (string) $result->getBody();
} catch (GuzzleException $e) {
    return "Exception!: " . $e->getMessage();
}

Notez que https://myapi.com/client/user l'itinéraire est juste un itinéraire que j'ai fait pour tests dans l'API. Cette route est définie comme:

Route::get('/user', function(Request $request) {
    return $request->user();
});

Maintenant. Je sais que cela ne fonctionne pas. C'est ce que je veux réaliser. Connaître l'utilisateur qui fait la demande avec access_token/bearer_token.

Merci.

15
Asier Paz

Vous avez oublié le middleware approprié.

Route::get('/user', function(Request $request) {
    return Auth::user();
})->middleware('auth:api');

Le flux d'authentification n'est pas déclenché lorsque vous ne mentionnez pas le middleware auth. C'est pourquoi vous obtenez null.

17
Syl

J'ai eu le même problème avec toi. Et je l'ai résolu après avoir défini manuellement le garde d'authentification.

Route::get('/user', function (Request $request) {
  return auth()->guard('api')->user();
});
12
Nurul Huda

Vous devez transmettre le jeton d'accès à chaque demande. Veuillez vérifier la documentation de cette partie ici

3
Mina Abadir