2017-10-09 1 views
2

Je construis un utilisateur-microservice REST utilisant Laravel 5.5 + Passport. J'utilise le standard Passport :: routes(), mais j'ai dû modifier les routes Auth :: pour les faire retourner des réponses JSON et les faire fonctionner avec Passport.Laravel API REST - boucle infinie

J'ai ajouté les lignes suivantes à mes itinéraires/fichier web.php:

Route::group(['middleware' => 'auth:api'], function() { 
    $this->post('logout', 'Auth\[email protected]')->name('logout'); 
}); 

Cela me permet de POST https://myapi/logout

  • Si je fais l'appel avec l'en-tête « Autorisation => Au porteur TOKEN ", j'obtiens une réponse de déconnexion réussie.
  • Si je fournis sans en-tête du tout, je reçois un message « non authentifié » (ce qui est bon)
  • Cependant, si je fournis l'en-tête avec un jeton révoqué, je reçois un deadloop récursif de la fonction: Illuminate\Auth\RequestGuard->user() (il continue d'appeler lui-même jusqu'à ce que la pile récursive-débordement)

Cela se fait dans le middleware auth:api, mon code n'est pas atteint fermeture de session, mais mon constructeur LoginController est appelé. Code constructeur:

public function __construct(Application $app) 
    { 
     $this->apiConsumer = $app->make('apiconsumer'); 

     $this->middleware('guest') 
      ->except('logout'); 
    } 

J'ai du mal à comprendre si c'est mon code causant ce problème, ou une combinaison de Laravel + passeport + auth. Ma première pensée a été que le middleware auth: api ne parvient pas à authentifier l'utilisateur, et par conséquent redirige l'utilisateur vers/home, où pour une raison quelconque, il est à nouveau déclenché, de manière récursive. Mais si c'était le cas, pourquoi cela fonctionnerait-il correctement sans en-tête? Ma pensée actuelle est que le jeton en question existe existe dans la base de données, mais Laravel ne parvient pas à comprendre qu'il est révoqué.

Toutes les suggestions appréciées,

+0

Avez-vous essayé de supprimer la route de déconnexion et d'enregistrer simplement les routes 'passport' comme indiqué dans les documents dans' AuthServiceProvider.php' dans la méthode 'boot()' en tapant 'Passport :: routes();'? –

+0

Je n'ai pas, puis-je ré-implémenter manuellement la méthode auth logout? – mils

Répondre

0

Je trouve une réponse (sinon la réponse) après beaucoup de recherches. Il semble que ce soit un bug de Laravel (https://github.com/laravel/passport/issues/440). La solution est d'ajouter OAuthServerException au tableau dontReport $ dans l'application/Exceptions/Handler.php:

class Handler extends ExceptionHandler 
{ 
    protected $dontReport = [ 
     ... 
     \League\OAuth2\Server\Exception\OAuthServerException::class, 
    ]; 
} 

Cela évitera d'essayer de se connecter les informations utilisateur, évitant ainsi la deadloop.