Laravel 419 (статус неизвестен) по запросу до обновления кэша браузера - PullRequest
0 голосов
/ 19 апреля 2019

При выходе из приложения я не могу повторно войти, потому что я получаю ошибку 419.Но это только пока я не очистил кеш браузеров.После перезагрузки страницы с помощью CTRL + F5 в Chrome (очищает кеш) я могу войти без проблем.

У меня есть внешний интерфейс Vue.JS и внутренний интерфейс Laravel.Они находятся в одном домене, поэтому я решил поместить маршруты API в веб-файл, как кто-то сказал мне в этом комментарии:

При выходе из системы я выполняю действие, при котором создается сообщениезапрос на мой маршрут выхода из системы:

export function logout() {
    return new Promise((res, rej) => {
        axios
            .post('/auth/logout')
            .then(response => {
                res(response.data);
            })
            .catch(err => {
                rej(err);
            })
    })
}

Вот мои маршруты:

Route::group(['prefix' => 'api', 'middleware' => 'auth:web'], function () {
    Route::get('memory', 'MemoryController@index');
    Route::put('memory/favorite', 'FavoriteController@update');
    Route::get('memory/{id}', 'MemoryController@show');

    Route::post('friend/add', 'FriendshipController@sendRequest');
});

Route::group(['prefix' => 'auth'], function () {
    Route::post('login', 'Auth\LoginController@login');
    Route::post('logout', 'Auth\LoginController@logout')->name('logout');

    Route::post('register', 'Auth\RegisterController@register');
});

Route::get('/{any}', 'SinglePageController@index')->where('any', '.*');

И это мой LoginController:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{


    use AuthenticatesUsers {
        logout as performLogout;
    }

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/timeline';

    public function logout(Request $request)
    {
        Auth::logout();
        $this->performLogout($request);
        return redirect('/');
    }

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

Я думаю, это что-тоделать со способом, которым я настроил свои Vue и Laravel, потому что я использую это как SPA, и это действительно не обновляет страницу?Я прав, думая об этом, или у него есть другая причина?Потому что эта ошибка возникает только тогда, когда я выхожу и пытаюсь войти снова, не обновляя мой кеш.Я что-то пропускаю в своем контроллере?

Обновление: Кажется, что я также иногда получаю эту ошибку 419, когда нажимаю кнопку выхода из системы.Ошибка выглядит следующим образом:

POST http://127.0.0.1:8000/auth/logout 419 (неизвестный статус)

Я не думаю, что это как-то связано с не отправкойCSRF-токен с запросом, потому что у меня есть этот кусок кода в моем bootstrap.js:

let token = document.head.querySelector('meta[name="csrf-token"]');

    if (token) {
        window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
    } else {
        console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
    }

Таким образом, каждый запрос должен содержать заголовок CSRF.

1 Ответ

1 голос
/ 19 апреля 2019

Проблема в том, что вы не перезагружаете страницу после выхода из системы.На вашей странице все еще есть устаревший токен CSRF, и после выхода из системы (при попытке входа в систему) вы увидите эту ошибку.

Кроме того, ваш метод Auth\LoginController@logout пытается перенаправить на /, но вывызывая его через запрос API, поэтому все, что он делает, перенаправляет этот запрос на страницу HTML.

Это должно решить эту проблему:

public function logout(Request $request)
{
  Auth::logout();
  $this->performLogout($request);
  return response()->json(['ok'=>true]); // whatever you want
}
export function logout() {
  return axios.post('/auth/logout')
              .then(() => {
                window.location.href = '/';
              })
              .catch(console.error.bind(console));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...