Laravel 419(未知状态)应要求提供,直到刷新浏览器缓存

时间:2019-04-19 07:14:37

标签: laravel vue.js

从应用程序注销时,由于出现419错误,因此无法重新登录。但这只是直到我清除浏览器缓存。在Chrome中使用CTRL + F5重新加载页面(清除缓存)后,我可以登录而没有任何问题。

我有一个Vue.JS前端和一个Laravel后端。它们在同一个域中,因此我决定将API路由放入Web文件中,就像有人在this评论中告诉我的话:

登出时,我执行一个操作,向我的登出路线发出发布请求:

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 个答案:

答案 0 :(得分:1)

问题是您注销后没有重新加载页面。您的页面仍具有过期的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));
}