Laravel - CSRF 与会话令牌不匹配

Posted

技术标签:

【中文标题】Laravel - CSRF 与会话令牌不匹配【英文标题】:Laravel - CSRF is not matching with session token 【发布时间】:2019-02-27 22:01:15 【问题描述】:

我正在尝试提交一个表单并登录一个用户,它似乎在 localhost 中工作正常,但是当我将此代码上传到实时服务器时,令牌不起作用。

我检查了 CSRF 令牌和会话令牌值不一样。

另外,post 请求不起作用,所以我在 VerifyCsrfToken 之外添加了路由,现在 post 请求正在起作用,但登录后用户会话不起作用

if (Session::token() != $request->get('_token'))

   echo 'Not Match';exit;

上面的结果显示我没有匹配。

我已经在服务器上重新生成了密钥,并且我已经提供了存储文件夹的权限。

缓存数据已被清除,但authectioncation不起作用它不起作用。

<form class="login-form js-login-frm" role="form" method="POST" action=" route('admin.login-post') ">
     csrf_field() 
    <div class="form-body">
        <div class="row">
            <div class="col-xs-12">
                <div class="form-group">
                    <div class="input-group" title="__('username_or_email_address')">
                        <span class="input-group-addon"><i class="fa fa-envelope-o"></i></span>
                        <input class="form-control" autofocus type="text" id="email_address" placeholder=" __('username_or_email_address') " name="login"/>
                    </div>
                </div>
            </div>
            <div class="col-xs-12">
                <div class="form-group">
                    <div class="input-group" title="__('enter_password')">
                        <span class="input-group-addon"><i class="fa fa-lock"></i></span>
                        <input class="form-control" id="password" type="password" placeholder=" __('enter_password') " name="password"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-actions">
        <button class="btn-del btn-5 btn-5a fa fa-lock login-btn" type="submit" id="login_btn">
            <span> __('login') </span>
        </button>
    </div>
</form>

在我的控制器中

$remember = $request->remember ? true : false;
$auth = Auth::guard('web')->attempt([
  'email' => $request->login,
  'password' => $request->password,
  'is_active' => 1
], $remember);

此代码工作正常,但用户没有被重定向到仪表板页面,它再次重定向到登录页面。

任何人都可以帮助登录系统中的用户,并重定向到正确的路线。

【问题讨论】:

【参考方案1】:

在测试环境中,CSRF 令牌不会在中间件中检查。将 csrf_field() 替换为@csrf 就可以了。查看生成的登录页面的源代码。

【讨论】:

不工作,它生成令牌但 session::token 和 _token 的值不匹配 您提到了重新生成的应用程序密钥。您是否运行了配置:缓存?我以前听说过你的问题。它与碰撞 cookie 有关。听起来很奇怪,我知道。当他们使用相同的应用程序密钥上传网站时发生了这种情况。其他浏览器上也会出现同样的情况吗? 不确定什么是 clear:all。如果您的应用程序密钥在测试和生产中不同并且不起作用,则很可能是某个地方的缓存问题。尝试在服务器上运行php artisan view:clearcomposer dump-autoload -o。后者将优化您的 PSR4 类图。 如果您在 /config 文件之外的某个地方使用了 env() 帮助程序,它不会在生产环境中使用它。您必须将其替换为config()。这可能不是您的问题的原因,但我想将其作为一个遥远的原因提及。

以上是关于Laravel - CSRF 与会话令牌不匹配的主要内容,如果未能解决你的问题,请参考以下文章

laravel 7 csrf 令牌不匹配

为啥我在 laravel 中运行测试时收到“CSRF 令牌不匹配”?

CSRF 和 iframe

在 laravel 5.5 的验证 csrf 令牌中没有收到错误令牌不匹配异常

Laravel 6 Passport CSRF 令牌不匹配

csrf 令牌会在 laravel 中的每个请求上自动重新生成,这会导致生产服务器上的 csrf 令牌不匹配