2015-03-30 22 views
5

Zajmuję się tworzeniem aplikacji internetowych przy użyciu Laravel 5 i angularJs z RESTFUL apis.Laravel automatycznie wylogował się po kilku sekundach?

Używanie middleware do celów uwierzytelniania. Mój problem polega na tym, że po wysłaniu kilku zapytań jednocześnie, system automatycznie wylogował się i wysłał 401 wyjątek od strony laravel.

kontroler baza API:

class ApiController extends BaseController { 

    use DispatchesCommands, ValidatesRequests; 

    function __construct() { 
     $this->middleware('api.auth'); 
    } 

} 

Middleware:

class APIMiddleware { 

    /** 
    * Handle an incoming request. 
    * 
    * @param Request $request 
    * @param Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) { 
     if (!Auth::check()) { 
      abort(401, "Unauthorized"); 
     } 
     return $next($request); 
    } 

} 

Zaloguj kontrolera

public function login(LoginRequest $request) { 
    if (Auth::check()) { 
     Auth::logout(); 
    } 

    if (Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')], $request->input('is_remember'))) { 
     return array(true); 
    } else { 
     abort(401, "Invalid email & password"); 
    } 
} 

Po kilku prośbę odszedł, Serwer wylogować i wysyła 401 wyjątek. Utknąłem z tym problemem.

+0

dla mnie ten błąd z powodu zmieniających ** always_populate_raw_post_data = -1 ** do ** ** always_populate_raw_post_data = 1 w pliku php.ini .... W końcu zmienił go do ** always_populate_raw_post_data = 0 ** i wszystko działało dobrze – ako

Odpowiedz

11

Teraz nie jestem w 100% pewna (i w zależności od konfiguracji nawet nie mogę powiedzieć, że jestem 90% pewien), ale po zmianie mojego session_driver z file do database wydaje mi się, że ten problem stałe - to znaczy, jeśli jest to ten sam problem.

myślę zrobić samething jak ty z mojej aplikacji - to jest na rozruchu stronie, robię 6 wniosek (jest rozwój i będę zmieniając go do jednej więc proszę don płacz). Jeśli załaduję tę stronę, działa ona z około 3 lub 4 żądaniami, a następnie pozostałe 2-3 wracają z odpowiedzią unauthorised. Występuje również tylko na żądanie, które wymagają middleware => auth.

Więc oto moja teoria, dlaczego tak się dzieje: Ponieważ domyślnie sesje są zapisywane w pliku - making wiele żądań naraz oznacza, że ​​plik jest otwarty 6 razy na raz - prawdopodobnie zepsuje to (w zależności od twojej maszyny). Dlatego zmiana sesji na bazę danych, która ma na raz tysiące żądań, działa!

ROZWIĄZANIE:

  1. Idź do pliku .env i zmienić SESSION_DRIVER=file do SESSION_DRIVER=database.
  2. Następnie należy utworzyć migrację sesji: php artisan session:table.
  3. Teraz composer dump-autoload dla dobrej praktyki.
  4. Po zakończeniu migracji (php artisan migrate).

UWAGA: nie jestem 100% pewien, ale jeśli jest to przypadek, ale dla mnie to rozwiązanie działało. Jestem również świadomy, że to pytanie jest naprawdę stare, ale zarówno deweloperzy, z którymi pracuję, jak i ja, mieli ten problem i nie wydaje się, żeby to było rozwiązanie, więc tylko dlatego, że to opublikuję.

+0

Dziękuję za komentarz .. Kiedy zmienię sesję z pliku na bazę danych. teraz działa dobrze ... – gsk

+0

Pracował także dla mnie. Dziękuję bardzo –

1

Może to być problem polegający na nielegalnym uzyskiwaniu dostępu do zmiennej użytkownika. Proszę użyć Auth::check() przed uzyskaniem dostępu do Auth::user() To wydaje się działać dla mojego projektu. Opcjonalnie możesz spróbować zmienić sterownik sesji z pliku .env.

+0

Myślę, że masz rację. Nie wiem dokładnie, jakie są tego przyczyny, ale wprowadziłem zmiany w moich kodach podczas używania instancji 'user', która została rozwiązana. Być może próbowałem uzyskać dostęp do 'użytkownika', gdy było to' null' lub coś w tym stylu. – ako

0

Może być przydatne dla kogoś: miał ten sam problem. Zmieniłem nazwę pliku cookie w ustawieniach sesji. Domyślnie jest to laravel_session, więc spróbuj ustawić ją na coś innego

0

Udało się ustalić to .. Ponieważ używam laravel dla prawie wszystkich moich projektów, zapomniałem zmienić nazwę sesji, w wyniku czego jeden sesja nadpisała drugą, powodując automatyczne wylogowanie. Jeśli masz wiele projektów laravel, upewnij się, że wszystkie mają różne nazwy sesji. Mam nadzieję, że to pomoże komuś w przyszłości! Here is a Laracast thread on this issue.

Dla mnie był to proces, aby rozwiązać ten problem:

  1. wyczyszczone pliki cookie przeglądarki na localhost.
  2. Zmieniono wartość klucza cookie w app/session.php.
  3. Przebiegł php artisan config:clear.
Powiązane problemy