gpt4 book ai didi

php - Laravel 419 错误 - VerifyCsrfToken 问题

转载 作者:行者123 更新时间:2023-12-02 05:19:44 24 4
gpt4 key购买 nike

我在同一台服务器上托管了多个 Laravel 站点。使用我创建的最新站点,联系表单拒绝提交而不会引发 419 错误。我已经在我的 web.php 文件中设置了路由,就像其他网站一样,这些网站具有实时、有效的联系表格,并且我以完全相同的方式生成和发送 token - 使用 {{ csrf_field() }} .
我找到了一个类似问题的答案,指出您可以通过向 $except 添加条目来禁用 Csrf 检查。 app/Http/Middleware/VerifyCsrfToken.php 中的数组.我已经验证这确实解决了 419 错误:

protected $except = [
'contact',
'contact*',
];
但当然我希望保留 Csrf 功能,我只更新了 $except用于故障排除值的数组。
有谁知道尽管传递了生成的 token ,但新的 Laravel 环境可能会有这种 419 行为?我尝试更新许多 ENV 设置并切换不同的东西,但除了修改 $except 之外别无他法。 array 对这个问题有任何影响。
更新
由于到目前为止已经有一些讨论,我想我会提供一些额外的信息和代码。
首先,这是一个 ajax 形式,但现在不要跳出你的座位。我一直在测试有和没有 ajax 的表单。如果我想用 ajax 进行测试,我只需单击连接到 jQuery 监听器的按钮。如果没有,我更改或删除按钮的 ID,或运行 $("#formName").submit();在控制台窗口中。
以上(ajax、老式提交和带有 .submit(); 的 jquery 选择器)都导致完全相同的响应 - 419 错误。
为了完整起见,这里是我的 ajax 代码,它适用于我托管的所有其他网站。我定义了一个 postData 数组以使其保持整洁,并添加了一个 console.log()紧跟其后的语句(再次)确认 token 生成得很好,并且正在与请求一起正确传递。
var postData = {

name: $("#name").val(),
email: $("#email").val(),
message: $("#message").val(),

_token: $("input[name=_token]").val()

};

console.log(postData);


$.post("/contact", postData, function (data) {

...
有任何想法吗?我的 ENV 或其他文件是否存在配置问题?
进度更新!
因为其他站点运行良好,我克隆了一个旧站点并简单地覆盖了我为新站点更改的文件,砰!它现在正在工作。做更多的挖掘,我跑了 php artisan --version在站点的克隆版本与非工作版本上,结果如下:

Working Version: Laravel Framework 5.7.3

Non-working Version: Laravel Framework 5.7.9


也许这是 Laravel 的一个错误?或者我服务器上的某些软件包可能已经过时,需要更新才能与新版本的 Laravel 一起使用?

最佳答案

TLDR: This post contains lots of potential issues and fixes; it is intended for those scouring for related bonus information when stuck.



我刚刚在中间件设置不当的情况下使用 Laravel Sanctum 遇到了这个错误。 Sanctum 使用 auth:sanctum守卫的中间件,它是 auth 的某种扩展Laravel 默认使用的守卫,但 session 由 web 处理中间件组。

我无法准确地描述 Laravel 内部的一些内容;目前我在 JavaScript 方面比 PHP 更有经验。

在我的 api.php文件,我有登录/注册/注销路由,在我的 Kernel.php 中文件,我复制了 \Illuminate\Session\Middleware\StartSession::class,从 web 组到 api 组。

我必须这样做来修复我的登录单元测试,该测试引发了关于“Session store not on request”的错误。复制允许我的 postJson请求在单元测试中工作,但过了一段时间,我开始看到 JavaScript 应用程序发布 419 CSRF 错误(这很糟糕,因为它之前工作得很好)。

我开始在 /storage/framework/sessions 中追逐一些文件系统权限红鲱鱼文件夹,但问题不在于(对我而言)。

后来我想通了 Laravel Sanctum 和默认的 AuthenticatesUsers trait,你必须使用 web保护身份验证,以及 auth:sanctum protected 路由的中间件。我试图使用 api保护身份验证路由,这是我的 AuthenticatesUsers 特征的 419 错误的核心。

如果有人在 CSRF 工作或应该工作时得到 419,我建议做一些 \Log::debug()对系统中需要这些工作的所有关键点进行调查:
Auth::check()

Auth::user()

Auth::logout()

如果你对这些有奇怪的行为,根据我的观察,你的配置有问题与 sessions 有关。或与 web 相关的配置有问题, api guard 。

guard 对 AuthManager 有影响保护多个请求和多个单元测试的状态。

这是我找到的最好的描述,我花了一个多星期才发现:

Method Illuminate\Auth\RequestGuard::logout does not exist Laravel Passport

作为最后一个随机示例,如果您的 session 以某种方式使用来自 web 的数据生成 CSRF token 。中间件组,而您的路由设置为使用 api ,他们可能会错误地解释收到的 CSRF。

除此之外,打开 Chrome 开发工具并转到应用程序选项卡,然后查看 cookie。确保您拥有 XSRF-TOKEN cookie 不安全(即:不是 httpOnly)。

这将允许您拥有一个 Axios 请求拦截器,例如:
import Cookies from 'js-cookie';

axios.interceptors.request.use(async (request) => {
try {
const csrf = Cookies.get('XSRF-TOKEN');
request.withCredentials = true;

if (csrf) {
request.headers.common['XSRF-TOKEN'] = csrf;
}

return request;
} catch (err) {
throw new Error(`axios# Problem with request during pre-flight phase: ${err}.`);
}
});

这就是我当前的 Laravel/Vue SPA 成功运行的方式。

过去,我也在这里使用过这种技术:

app.blade.php (根布局文件,文档头)
<meta name="csrf-token" content="{{ csrf_token() }}">

bootstrap.js (或任何地方)
window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

const token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

在我看来,大多数问题都源于以下一个或多个文件中的错误值:
  • ./.env
  • ./config/auth.php
  • ./config/session.php

  • 密切关注 SESSION_DOMAIN、SESSION_LIFETIME 和 SESSION_DRIVER 之类的东西,就像我说的,文件系统权限。

    检查你的 nginx access.log和/或 error.log文件;它们可能包含一个提示。

    关于php - Laravel 419 错误 - VerifyCsrfToken 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52764590/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com