部署到 Cloud Run 后 POST 请求中缺少 XSRF 令牌

问题描述 投票:0回答:1
  • 使用 Laravel 11、Inertia 和 React -> Docker 镜像 -> Cloud Run
  • /
    打开应用程序后,我会按预期重定向到
    /login
  • 检查到目前为止的网络请求,请求和响应中存在 X-XSRF 标头和 cookie。
  • 输入登录名/密码并提交表单后,我被重定向到“419 页面已过期”。此时网络请求包含任何 X-XSRF 标头或 cookie。
  • 相比之下:在本地运行图像,登录有效并且请求具有 X-XSRF 令牌。

我尝试了多种方法来强制包含 XSRF 令牌,例如包含表单上的隐藏输入字段、搞乱中间件和各种配置设置。直到最近我才注意到早期的请求(在表单提交之前)实际上已经包含了令牌。据说惯性会自动处理这个问题。

现在我一直在尝试想出更多的方法来弄清真相。 这是请求,为了完整性,我想:

POST /login HTTP/3
Host: inertia-react-162956230927.asia-northeast2.run.app
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0
Accept: text/html, application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/json
Content-Length: 70
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: ba6fd3500ad1fa8ab5152eef0ed1845b
Origin: https://inertia-react-162956230927.asia-northeast2.run.app
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin

正如您所看到的,没有 X-XSRF 令牌,尽管它应该存在。 在之前对登录页面的 GET 请求中,这是响应的一部分:

XSRF-TOKEN=eyJpdiI(...)iIn0%3D; expires=Wed, 02 Oct 2024 04:24:58 GMT; Max-Age=7200; path=/; domain=inertia-react-162956230927.asia-northeast2.run.app; samesite=lax

我截断了令牌本身。我想如果您愿意,您可以自己通过 GET 请求访问该域并查看发生了什么。 现在我希望有人能指出 A:我在这里明显误解的东西,或者 B:分析和隔离问题的其他方法,或者 C:我的头脑围绕着这个问题来理解发生了什么。

PS:项目本身与本教程中的内容基本相同https://youtu.be/VrQRa-afCAk?si=BX23_FzKshzscERW,并且在解决部署问题后将进行重新建模。并不是说我希望有人观看这个 5 小时的视频,但也许有人熟悉这个设置......

reactjs laravel csrf inertiajs
1个回答
0
投票

好吧,在几乎绝望并尝试了所有对其他人有用且与我的问题有一点相似的方法之后,我偶然发现了一个解决方案。 在

resources/js/bootstrap.js
中我添加了这两行:

window.axios.defaults.withCredentials = true; 
window.axios.defaults.withXSRFToken = true;

即使在浏览器中检查网络请求,XSRF 令牌现在似乎也存在,但也许它仍然没有正确传输,或者出现了问题。

这有点不满意,因为我仍然不明白这个问题,但我会把它留在这里,以防将来有人绊倒这个线程。毕竟,似乎有几个人遇到了类似的问题,尽管原因和解决方案也可能有所不同。

顺便说一句,我在这里找到了适合我的解决方案:https://laracasts.com/discuss/channels/inertia/laravel-10-inertia-error-419-on-product

© www.soinside.com 2019 - 2024. All rights reserved.