问题:当我通过 Ajax 调用登录用户时,Laravel 在同一页面的下一个 Ajax Post 上返回 419 CSRF token 不匹配。
在结帐页面上,我有一个供现有用户使用的登录按钮。单击时,它会向用户显示登录模式。如果凭据匹配,用户无需刷新页面即可登录。当用户没有帐户时,会出现一个注册模式,用于注册用户并让他们登录。
当用户完成结帐过程并提交表单时,Laravel 返回 CSRF token 不匹配错误。
最佳答案
成功登录后,Laravel 使用 AuthenticatesUsers 特征发送登录响应。
然后,登录响应调用 session() 上的 regenerate 方法,该方法生成新的 CSRF token 。因此,您用于登录用户的 csrf token 对于下一个 POST 请求不再有效。
/**
* Send the response after the user was authenticated.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
if ($response = $this->authenticated($request, $this->guard()->user())) {
return $response;
}
return $request->wantsJson()
? new Response('', 204)
: redirect()->intended($this->redirectPath());
}
我通过在成功登录响应中返回新的 csrf token 来处理此问题,并将其存储以供下一个 POST 请求使用。我所说的存储是指将其作为变量保存在 JavaScript 中,或者在我的例子中使用在应用程序状态中设置的 React.js。
在 Auth/LoginController 中,我添加了经过身份验证的方法,该方法覆盖了 AuthenticatesUsers 特征中的相同方法。
然后,在验证请求的行之后,我检查这是否是 Ajax 请求并返回新的 CSRF token 。
protected function authenticated(Request $request, $user) {
$credentials = array (
'email' => $request->get('email'),
'password' => $request->get('password'),
);
$valid = Auth::validate($credentials);
if ($valid && $request->ajax()) {
return response()->json([
'auth' => auth()->check(),
'user' => $user,
'intended' => $this->redirectPath(),
'csrf' => csrf_token(),
]);
}
// Nothing changed from here on
}
关于php - Ajax 登录后 Laravel 返回 CSRF token 不匹配(响应代码 419),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63098927/