首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel在Ajax登录后返回CSRF令牌不匹配(响应代码419)

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

Stack Overflow用户
提问于 2020-07-26 18:29:11
回答 1查看 476关注 0票数 1

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-26 18:29:11

在成功登录之后,Laravel会使用AuthenticatesUsers特征发送登录响应。

然后,登录响应调用session()上的regenerate方法,该方法生成一个新的CSRF令牌。因此,您用于登录用户的csrf令牌对于下一个POST请求不再有效。

代码语言:javascript
运行
复制
/**
     * 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令牌。

代码语言:javascript
运行
复制
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
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63098927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档