【问题标题】:How to solve Laravel not generating CSRF token如何解决 Laravel 不生成 CSRF 令牌
【发布时间】:2021-06-07 03:09:16
【问题描述】:

好的,所以我一直在使用 jQuery 连接到一个控制器函数,该函数验证数据并使用 this code 通过 AJAX 提交数据。直到我周六请了一天假,这一切都完美无缺。昨天回到项目,我一直遇到 HTTP 代码 419 的这个错误

"message": "CSRF token mismatch.",
"exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",
"file": "C:\\workspace\\app_name\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Exceptions\\Handler.php",
"line": 387,

所以我尝试回显 CSRF 令牌,但它是空白的!请记住,它在周五工作得很好,然后到了周日(昨天),没有外部输入,它只是随机地打动了我。它不生成令牌的原因可能是什么?

【问题讨论】:

  • 当 CSRF 令牌丢失或过期时,Laravel 框架使用 HTTP 代码 419。
  • 首先,感谢您抽出宝贵时间。如果令牌过期,我该如何重新生成它?
  • 尝试 php artisan key:generate
  • 你好 John,这是用来在 .env 文件上生成 APP_KEY 的吧?我还是试过了,可惜没用。
  • 好的。一旦你尝试使用不同的浏览器或清除浏览器缓存。也尝试 php artisan view:clear php artisan config:clear

标签: php ajax laravel


【解决方案1】:

好的,所以我只是在工作日结束前快速将此代码添加到我的代码中,因此没有时间测试因此未能注意到错误。

$request->session()->flush();

这行代码负责清除会话。不过,它在 Laravel 文档中没有提到的是,由于 CSRF 令牌也是会话,因此使用它基本上会使 IO 无法访问您的数据库,因为它会清除包括所述令牌在内的所有会话。因此,在解决此问题之前(理想情况下,使用 sn-p 代码清除开发者创建的会话,同时保留内置的 Laravel 会话),避免使用这行代码。相反,使用它来清除单个会话:

// Forget a single key...
$request->session()->forget('name');

或者这个清除多个会话

// Forget multiple keys...
$request->session()->forget(['name', 'status']);

您还可以了解更多关于这个漂亮框架的会话here

最后,感谢@Indra Kumar S、@John Lobo、@Manjeet 和 @Paras Rayani 抽出时间浏览该平台并为他人提供帮助。肯定会这样做。

【讨论】:

    【解决方案2】:

    运行以下命令:

    php artisan key:generate
    

    然后清除缓存

    php artisan cache:clear 
    

    如果您想查看令牌值是否发生变化,请尝试以下代码

    Route::get('/token', function (Request $request) {
        $token = $request->session()->token();
        echo $token;
        $token = csrf_token();
        echo $token;
    
    });
    

    【讨论】:

    • 非常感谢@Manjeet 的建议。我刚刚找到了解决方案,这是我无知的结果?。
    • 很高兴您找到了解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2010-12-20
    • 2014-01-21
    • 2012-02-01
    • 2011-08-24
    • 2014-05-17
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多