web-dev-qa-db-fra.com

Laravel redirections inattendues (302)

J'ai lancé un nouveau projet Laravel 5.2 en utilisant laravel new MyApp et ajouté une authentification via php artisan make:auth. Ceci est destiné à être un site Web réservé aux membres, où le premier utilisateur est créé, et crée le reste (pas de création manuelle d'utilisateur/réinitialisation du mot de passe/etc).

Ce sont les routes que j'ai actuellement définies:

 Route::group(['middleware' => 'web'], function () {
  // Authentication Routes...
  Route::get( 'user/login',  ['as' => 'user.login',     'uses' => 'Auth\AuthController@showLoginForm']);
  Route::post('user/login',  ['as' => 'user.doLogin',   'uses' => 'Auth\AuthController@login'        ]);

  Route::group(['middleware' => 'auth'], function() {
    // Authenticated user routes
    Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
    Route::get( 'user/{uid?}', ['as' => 'user.profile',   'uses' => 'Auth\AuthController@profile' ]);
    Route::get( 'user/logout', ['as' => 'user.logout',    'uses' => 'Auth\AuthController@logout'  ]);
    Route::get( '/user/add',   ['as' => 'user.add',       'uses' => 'Auth\AuthController@showAddUser']);

    [...]
  });
});

Je peux me connecter très bien, mais je rencontre un comportement très "funky" - lorsque j'essaie de me déconnecter (via la méthode logout intégrée créée par artisan), la page effectue une redirection 302 vers domicile, toujours connecté.

De plus, alors que presque toutes les pages (non répertoriées ici) fonctionnent comme prévu, user.add génère également un 302 pour la page d'accueil. 

Notez que la page d'accueil est déclarée à AuthController en tant que $redirectTo, si cela fait une différence.

J'ai découvert les redirections via la barre de débogage. Une idée sur quoi chercher?

11
Nick Andriopoulos

Après plusieurs heures de coupe de cheveux, j'ai trouvé ma réponse - et c'est idiot.

Le problème est que l'itinéraire user.profile a un chemin user/{uid?} et qu'il correspond à la fois à user/logout et à user/add en tant que chemins. 

Etant avant les autres, et n'ayant pas de regex ou similaire, il a géré la route. 

Je ne sais toujours pas pourquoi un 302 a été généré pour que page, mais j'ai constaté que le fait de le déplacer hors de la variable AuthController dans la variable UserController (où il devrait se trouver depuis le début) corrigeait le comportement. 

Ainsi, mes itinéraires (modifiés et de travail) ressemblent maintenant à ceci:

Route::group(['middleware' => 'web'], function () {
  // Authentication Routes...
  Route::get( 'user/login',  ['as' => 'user.login',     'uses' => 'Auth\AuthController@showLoginForm']);
  Route::post('user/login',  ['as' => 'user.doLogin',   'uses' => 'Auth\AuthController@login'        ]);

  Route::group(['middleware' => 'auth'], function() {
    // Authenticated user routes
    Route::get( '/',     ['as'=>'home', 'uses'=> 'HomeController@index']);
    Route::get( '/home', ['as'=>'home', 'uses'=> 'HomeController@home']);
    Route::get( 'user/logout', ['as' => 'user.logout',    'uses' => 'Auth\AuthController@logout'  ]);

    // *** Added /profile/ here to prevent matching with other routes ****
    Route::get( 'user/profile/{uid?}', ['as' => 'user.profile',   'uses' => 'UserController@profile' ]);
    Route::get( '/user/add',           ['as' => 'user.add',       'uses' => 'UserController@showAddUser']);

    [...]
    });
});
3
Nick Andriopoulos

J'ai rencontré un problème avec 302 redirections lors de l'envoi de requêtes ajax. La solution dans ce cas était de ne pas oublier d'inclure le jeton CSRF. 

Voir les documents Laravel 5.4 ici: https://laravel.com/docs/5.4/csrf

6
mistajolly

La page de redirection par défaut après la déconnexion est probablement home et semble ne pas avoir home dans votre itinéraire web. Essayez le code ci-dessous dans votre AuthController.php

use AuthenticatesAndRegistersUsers, ThrottlesLogins; // after this line
$redirectAfterLogout = 'login' // add this line

Cela vous redirigera vers la page login après la déconnexion. Vous pouvez le changer pour n’importe quel itinéraire si vous le souhaitez. J'ai utilisé login comme exemple.

OU

Vous pouvez changer de route après la déconnexion dans \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php

public function logout()
    {
        Auth::logout();

        return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : 'login');
    }

J'ai changé la route par défaut en login. Si vous n'avez pas $redirectAfterLogout dans votre AuthController.php, il cherchera ici le chemin de redirection. Je ne suggère pas aux gens d'éditer ici, c'est un peu difficile à coder.

1
smartrahat

J'ai eu le même problème et je l'ai résolu en ajoutant l'en-tête avec accept: 'application/json'. Et je pense avoir vérifié le code source avant ce qui indique que si vous n’ajoutez pas cela, il risque d’être redirigé lorsque vous utilisez le middleware auth. Mais je ne suis pas sûr que ce soit le cas et je ne peux pas me rappeler où j'ai trouvé cela.

0
James

J'ai eu ce problème et il s'est avéré que j'avais un itinéraire: rediriger à l'intérieur de mon contrôleur ajax ., Ce qui n'a pas de sens car il est évident que nous devons renvoyer ajax mais je retournais un itinéraire!

0
Pedram Vdl