web-dev-qa-db-fra.com

Laravel 5.6 - Comment obtenir auth () -> user () ou $ response-> user () dans le contrôleur api?

Dans le fichier de routes api.php Ci-dessous, il existe des routes publiques et des routes privées:

Route::group(['namespace' => 'API'], function() {

     // Public routes (auth not required)
     Route::group([], function() {
         Route::get('/testauth1', 'TestController@testauth1');
         // more public routes...
     });

     // Private routes (auth required)
     Route::group(['middleware' => 'auth:api'], function() {
         Route::get('/testauth2', 'TestController@testauth2');
         // more private routes...
     });

});

Dans le TestContoller ce sont les 2 méthodes appelées ci-dessus:

class TestController extends Controller {

    public function testauth1(\Request $request) {
      // return auth()->user(); // does not return user
      return $request->user(); // does not return user
    }

    public function testauth2() {
      return auth()->user(); // returns user
    }

}

Étant donné que le groupe de routes privées possède le middleware auth:api, Nous nous assurerons que l'utilisateur est authentifié en vérifiant le jeton fourni dans l'en-tête Authorization Bearer. Ce n'est que si un jeton valide est présent que les routes privées seront rendues à l'utilisateur authentifié. C'est pourquoi TestController@testauth2 Renvoie correctement l'utilisateur d'authentification.

Désormais, tout le monde peut accéder aux voies publiques, avec ou sans jeton. S'il n'y a pas de jeton fourni dans l'en-tête Authorization Bearer, Alors nous n'aurons pas d'utilisateur authentifié, ce qui est logique. C'est pourquoi TestController@testauth1 Ne renvoie pas un utilisateur d'authentification. Cependant, lorsqu'un utilisateur connecté accède à /testauth1 Voie publique, il fournit son jeton dans l'en-tête Authorization Bearer Et doit donc être renvoyé dans TestController@testauth1 Sinon avec auth()->user() au moins avec la $request->user() mais nous ne pouvons pas sembler accéder à l'utilisateur avec son jeton fourni dans cette méthode.

Une idée de la façon dont nous pouvons accéder à l'utilisateur de jeton valide dans toutes les méthodes de route publique?

7
Wonka

Passez la garde api en tant que paramètre pour récupérer l'utilisateur autorisé sans le middleware protégeant la demande.

$request->user('api');

// Or

auth('api')->user();
26
Aken Roberts

Vous faites référence à Request à partir d'un espace de noms racine: \Request. Au lieu de cela, vous devez référencer la classe Illuminate\Http\Request.

Vous devez supprimer le \ De votre paramètre et ajouter la ligne suivante à vos importations.

use Illuminate\Http\Request;

Alternativement, vous pouvez également référencer la classe de demande directement dans votre méthode:

class TestController extends Controller {

    public function testauth1(Illuminate\Http\Request $request) {
        return $request->user();
    }

    public function testauth2() {
        return auth()->user(); // returns user
    }

}

La méthode d'assistance auth() ou Auth Facade est disponible dans le monde entier. Cela ne dépend pas de la demande à laquelle vous essayez d'accéder. Il en va de même pour les assistants request() et Request:: Je crois. Dans le cas où vous donnez, vous faites référence à une mauvaise instance de demande, d'où un résultat inattendu.

3
Mark Walet