为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
MMTTMM 2023-08-26 17:36:53
问题:当我通过 Ajax 调用登录用户时,Laravel 在同一页面的下一个 Ajax Post 上返回 419 CSRF 令牌不匹配。在结帐页面上,我有一个供现有用户使用的登录按钮。单击时,它会向用户显示登录模式。如果凭据匹配,用户无需刷新页面即可登录。当用户没有帐户时,会出现一个注册模式,用于注册用户并让他们登录。当用户完成结帐过程并提交表单时,Laravel 返回 CSRF 令牌不匹配错误。
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

成功登录后,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

    }


查看完整回答
反对 回复 2023-08-26
  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信