419 页面在 laravel 5.7 中过期

Posted

技术标签:

【中文标题】419 页面在 laravel 5.7 中过期【英文标题】:419 page expired in laravel 5.7 【发布时间】:2020-09-28 22:37:17 【问题描述】:

我在 Laravel 5.7 多重身份验证中遇到问题419 page expired。如果我尝试在同一个浏览器中但在不同的选项卡中登录用户和管理员。就像在一个选项卡中打开了用户登录屏幕,在第二个选项卡中打开了管理员登录屏幕。首先,我尝试用普通用户登录,用户登录成功。但是当我转到第二个选项卡并尝试登录管理员用户时,在这种情况下会出现 419 页面过期错误。但是,如果我在管理员登录尝试之前刷新第二个选项卡意味着管理员登录页面,那么管理员可以正常工作并成功登录而没有任何错误(419 页面已过期)。你能帮我解决这个问题吗?我已经在表单中发送@csrf 令牌。

【问题讨论】:

除非您使用 Firefox 的容器或两种不同的浏览器,否则您通常无法在不同的选项卡中以不同的用途登录。当您在第二个选项卡上登录时,第一个选项卡中的 CSRF 令牌将失效。 Incognito 模式打开另一个选项卡。然后登录 发布您的身份验证配置 基本上我为每种用户类型使用不同的防护,每个用户对所有操作(如登录、注册和忘记密码)都有不同的控制器和路由。视图也不同,我想在同一个浏览器的两个不同选项卡中登录用户和管理员 这是一个常见的场景。看这里,***.com/a/57095026/8135271 【参考方案1】:

在您使用任何角色登录之前,两个页面具有相同的令牌值。 (请查看其他有关 Laravel CSRF 令牌的文章)

Laravel 自动为应用程序管理的每个活动用户会话生成一个 CSRF“令牌”。

因此,如果您登录,将启动新的用户会话并重新生成 CSRF 令牌。

这就是为什么您在刷新之前在管理页面上收到 419。如果刷新页面,Laravel 会渲染新的 token 值。

请使用 Inspect 功能在您的浏览器上进行测试。

【讨论】:

你能帮帮我吗,我该如何解决这个问题?是的,刷新登录成功后我已经验证了,但是我的问题是,我该如何解决这个问题? 据我所知,这是不可能的,因为 laravel 会为新会话生成新的 csrf 令牌。我认为只有一种方法。就是将你需要的路由(比如管理员登录url)添加到中间件的异常url中。 为什么要在一个浏览器中使用 2 个角色登录?你想要什么? :) 这不是问题。这是正常的动作。你能告诉我你到底想要什么吗? 实际上我想在一个浏览器中使用不同的用户角色(如用户和管理员)登录,你能告诉我这可以实现吗?【参考方案2】:

我遇到了这个问题,事实证明我已经阻止了所有浏览器 cookie。确保您的 cookie 未被浏览器设置阻止。

【讨论】:

【参考方案3】:

您可以在登录后使用WebSockets 刷新令牌。

【讨论】:

以上是关于419 页面在 laravel 5.7 中过期的主要内容,如果未能解决你的问题,请参考以下文章

419 页面使用 laravel sanctum 过期

laravel 5.8.7 页面过期(419)

Laravel 页面已过期 419

登录laravel后页面刷新时419页面过期错误

Laravel CSRF - 419 页面因向其他网站的发布请求而过期

Laravel 5.7 Ajax 发布请求返回 419 状态码