php - Ajax 登录后 Laravel 返回 CSRF token 不匹配(响应代码 419)

标签 php ajax laravel

问题:当我通过 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/

相关文章:

php - Laravel Nova BelongsTo 在关系方法名称和外键前缀不同时不起作用

php - % (joker) 在我使用 IN 运算符的 sql 查询中不起作用

javascript - Jquery Ajax问题,不获取选项值

javascript - 更改下拉选择的表单操作

javascript - 从另一个 div 的导航更改一个 div 的内容

php - laravel登录后添加中间件

php - 如何为 Laravel artisan 设置超时

php - __construct() vs 与类同名的方法

javascript - 当我使用 JQuery 加载页面时,表单的提交不起作用

javascript - 防止表单中重复提交数据