【问题标题】:Laravel 5.7 tokenmismatch error when trying to post form尝试发布表单时 Laravel 5.7 tokenmismatch 错误
【发布时间】:2019-12-26 03:51:06
【问题描述】:

我正在运行 laravel 5.7,我将会话更改为数据库。我做了make:auth 并尝试注册并得到一个错误页面

“页面因不活动而过期。请刷新并重试”

我已经在这里待了几天了。我将 /register 添加到 except 数组以绕过验证令牌并能够注册。现在我正在尝试登录并遇到同样的问题。我已经**清除缓存,检查设置,切换回文件,尝试其他浏览器,验证令牌在表单中,确保它在标题中,确保它被通过但仍然没有。我将此添加到异常中的 Handler 类中:

if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
    return redirect()->back()->with('error_message',"Oops! Seems there was an error with login. Please try again or contact us.");
}

这让我相信令牌不匹配,因为它重定向而不是转到损坏的页面。我已经阅读了我认为互联网上的每一篇文章,但无法弄清楚这一点。我的下一个选择是从新安装开始,除非有人知道是什么原因造成的?

这是在我的本地。我还没有将任何东西投入生产。

编辑添加表单:

{!! Form::open(['route' => 'login', 'method' => 'post']) !!}
    <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
      <label for="email" class="col-md-4 control-label">E-Mail Address</label>

      <div class="col-md-12">
        <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus>

          @if ($errors->has('email'))
            <span class="help-block">
              <strong>{{ $errors->first('email') }}</strong>
            </span>
          @endif
      </div>
    </div>

    <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
      <label for="password" class="col-md-4 control-label">Password</label>
        <div class="col-md-12">
          <input id="password" type="password" class="form-control" name="password" required>
          @if ($errors->has('password'))
            <span class="help-block">
              <strong>{{ $errors->first('password') }}</strong>
            </span>
          @endif
        </div>
    </div>

    <div class="form-group">
      <div class="col-md-6 offset-md-4">
        <div class="checkbox">
          <label>
            <input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> Remember Me
          </label>
        </div>
      </div>
    </div>

    <div class="form-group">
      <div class="col-md-8 offset-md-4">
        <button type="submit" class="btn btn-primary">Login </button>
        <a class="btn btn-link" href="{{ route('password.request') }}">
           Forgot Your Password?
        </a>
      </div>
    </div>

{!! Form::close() !!}

【问题讨论】:

  • 您能否发布显示您尝试提交的表单的代码?以及你得到的确切错误?谢谢。
  • 确保您的 storage/framework/sessions 文件夹是可写的,并尝试清除您的浏览器 cookie 以获得您的本地 url。
  • @PA-GW 按要求添加了表单
  • @DevinNorgarb 是的,会话文件夹是可写的,我还在代码中检查了它并验证它是可写的。
  • 你在哪里实现 csrf?

标签: laravel csrf laravel-5.7


【解决方案1】:

尝试使用其他浏览器登录或使用隐身窗口。

还请记住,在您发布的任何表单上都使用刀片文件中的@csrf。

【讨论】:

  • 我在隐身模式和 Safari 中尝试过,两者都存在同样的问题。我在标题中有 csrf,它填充了隐藏字段。贴出上面的表单代码。
  • 它不应该在标头中,它应该在您的 POST 请求的正文中。
【解决方案2】:

此问题来自失败的 CSRF 令牌验证:

'页面由于不活动而过期。请刷新并尝试 再次。'

您应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件可以验证请求。

<form method="POST" action="/profile">
    @csrf
    ...
</form>

它不起作用,然后刷新浏览器缓存,现在它可能会起作用

【讨论】:

    【解决方案3】:

    不应该出现任何错误,所以如果你只想创建身份验证脚手架,我建议只创建一个新的 laravel 项目。

    执行以下步骤:

    1. laravel new app
    2. 创建数据库
    3. 将数据库凭据添加到您的 .env 文件中
    4. 在项目内部的命令行中运行 php artisan:migrate,这应该会为您创建一个用户表
    5. 运行php artisan make:auth,这将创建基本的身份验证逻辑
    6. 最后再次运行php artisan migrate

    【讨论】:

      【解决方案4】:

      如果将来有人来到这里并尝试了所有解决方案,但它们不起作用,我想分享最终对我有用的方法。我首先安装了一个新的 laravel 5.8 实例。我确实 make:auth 并检查了标准表单是否按预期工作。然后,我从不起作用的实例中添加了代码,这基本上是我的自定义 app.blade.php、header.blade.php、footer.blade.php、welcome.blade.php register.blade.php、helpers.php (包含我的自定义辅助函数)并使用我使用的包更新了 composer.json。我运行了作曲家更新,但它不起作用。我回到开始并单独添加每个部分,直到我发现问题。我不知道为什么会这样,但问题是这样的:

      我在 app/ 中有一个名为 helpers.php 的自定义文件。我通过 composer.json 像这样添加它:

      "autoload": {
              "classmap": [
                  "database/seeds",
                  "database/factories"
              ],
              "psr-4": {
                  "App\\": "app/"
              },
              "files": [
                  "app/Http/helpers.php"
              ]
          },
      

      我有一个函数用于包装文件,该函数添加到我的 aws S3 端点中。而已。但由于某种原因,这导致网站在每个页面加载时重定向回自身并给我一个新会话。我会一遍又一遍地刷新,只看会话文件的积累。我读到辅助函数在 5.9 中被弃用了,所以我继续创建了一个提供程序,然后使用它来代替我的辅助函数,这可以解决问题。

      如果有人知道为什么会发生这种情况,我很想听听。但是,如果您遇到此问题,请在编辑器中打开会话文件夹,看看您是否不断收到新会话。如果是这样,那么回溯并查看导致它重新路由的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-25
        • 2019-05-21
        • 1970-01-01
        相关资源
        最近更新 更多