1

我在上次注销后尝试登录时收到页面过期错误(er.419)。

我正在使用 Laravel 和 Vue.js 制作 SPA 的身份验证页面。它在第一次登录时运行良好,但在注销后显示提交第二次登录时出错。

我认为问题是先前发送的 CSRF 并且(可能)在注销后过期。

我的工作流程是这样的:

登录组件具有作为 POST 方法发送到 Laravel API 的隐藏表单,该表单具有来自 Laravel 模板创建应用程序时设置的 HTML META TAG 的 csfr-token 值:

元名称="登录状态" 内容="{{ Auth::check() }}"

注销是通过 vue 组件中的 fetch 请求完成的。所以没有刷新。

感谢您的任何建议!

4

1 回答 1

2

来自 laravel 文档(https://laravel.com/docs/5.8/csrf#csrf-introduction):

Laravel 会为应用程序管理的每个活动用户会话自动生成一个 CSRF “令牌”。此令牌用于验证经过身份验证的用户是实际向应用程序发出请求的用户。

当您注销时,您正在使当前会话无效 - 这意味着您缓存在元数据中的 csrf 令牌变得无效。

解决方案 1

成功注销后刷​​新页面,以便 php 可以将活动的 csrf 令牌输出到您的元标记中。例如:

fetch('/api/logout', {
    method: 'post'
}).then(() => {
    window.location.href = '/login';
});

解决方案 2

考虑使用api路由中间件组。这样做意味着应用程序不会触发App\Http\Middleware\VerifyCsrfToken中间件。请记住,您将无法再访问会话,因此您需要研究无状态身份验证技术,例如通过 JWT 的。

Laravel 自己甚至提供了一个用于验证 api 的包。(https://laravel.com/docs/5.8/passport

于 2019-05-23T16:23:33.893 回答