从应用程序注销时,由于出现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标头。
答案 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));
}