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?
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();
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.