Ajax 登录后 Laravel 返回 CSRF 令牌不匹配(响应代码 419)

问题:当我通过 Ajax 调用登录用户时,Laravel 在同一页面的下一个 Ajax Post 上返回 419 CSRF 令牌不匹配。

在结帐页面上,我有一个供现有用户使用的登录按钮。单击时,它会向用户显示登录模式。如果凭据匹配,用户无需刷新页面即可登录。当用户没有帐户时,会出现一个注册模式,用于注册用户并让他们登录。

当用户完成结帐过程并提交表单时,Laravel 返回 CSRF 令牌不匹配错误。


MMTTMM
浏览 241回答 1
1回答

有只小跳蛙

成功登录后,Laravel 使用 AuthenticatesUsers 特征发送登录响应。然后,登录响应调用 session() 上的 regenerate 方法,该方法生成新的 CSRF 令牌。因此,您用于登录用户的 csrf 令牌对于下一个 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 令牌来处理此问题,并将其存储以在下一个 POST 请求中使用。我所说的存储是指将其作为变量保存在 JavaScript 中,或者在我的例子中使用在应用程序状态中设置的 React.js。在 Auth/LoginController 中,我添加了经过身份验证的方法,该方法覆盖了 AuthenticatesUsers 特征中的相同方法。然后,在验证请求的行之后,我检查这是否是 Ajax 请求并返回新的 CSRF 令牌。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    }
打开App,查看更多内容
随时随地看视频慕课网APP