Laravel Sanctum 突然令牌不匹配,仅在清除浏览器 cookie 后有效
Posted
技术标签:
【中文标题】Laravel Sanctum 突然令牌不匹配,仅在清除浏览器 cookie 后有效【英文标题】:Laravel Sanctum suddenly token mismatch, only works after clearing browser cookies 【发布时间】:2021-10-27 13:38:40 【问题描述】:我在使用 Laravel Sanctum 时遇到了一个奇怪的问题。我已按照文档中的说明对其进行了配置,并且可以正常工作。
但有时它在尝试获取 sanctum-protected 路由时开始发送 419 错误,并且仅在清除浏览器 cookie 或重置应用程序密钥 (php artisan key:generate) 后才有效。
它只发生在具有本地域的本地环境中(webapp.test 由主机文件路由并由 Apache 网络服务器提供服务),但我担心这会发生在生产服务器上。
我的 .env 文件包含我阅读的下一个配置,它需要在本地环境中工作:
SESSION_DOMAIN=webapp.test
SANCTUM_STATEFUL_DOMAINS=webapp.test
此外,会话驱动程序和生命周期是默认值:
SESSION_DRIVER=file
SESSION_LIFETIME=120
我的 config/cors.php 文件:
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => false,
'max_age' => true,
'supports_credentials' => true,
];
我的 bootstrap.js 文件:
window.axios = require("axios");
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
window.axios.defaults.withCredentials = true;
我有一个实例化 axios 的 api.js 文件:
import axios from "axios";
export const api = axios.create(
baseURL: `$baseUrl/api`,
headers:
"Content-Type": "application/json",
,
);
然后当我必须调用我的 api 端点时,我只需导入这个 api,例如:
import api from "api";
...
api.post(`/cart/add`,data).then(()=>).catch(err=>console.error(err);
正如我之前所说,webapp 运行良好,但几天后它会突然阻止所有请求并发送 419 令牌不匹配错误(即使在使用私有模式时),直到清除浏览器 cookie 或重置应用程序密钥。
我的设置有什么问题还是您认为只是本地行为?
任何建议都会有所帮助。
【问题讨论】:
您可以尝试其他会话驱动程序,看看是否有相同的结果? 只是您的会话生命周期设置为 2 小时吗?您只需要重新验证您的用户 【参考方案1】:问题是您的令牌在您的配置中指定的特定时间后过期。生产版本也可能发生这种情况。
我假设您是在本地注意到问题,而不是因为您正在测试您的应用程序并且令牌在那个时刻到期。
我会将令牌过期时间设置为一小时,并每 50 分钟在您的 SPA 后台更新访问令牌。这可以防止当前正在使用该网站的用户被注销。
如果用户在一定时间后返回站点并且在他们的 cookie 中有一个过期的令牌,并且您的路由发回代码 419,您可以通过 axios interceptor 响应错误并从浏览器 cookie 并向用户显示登录窗口。
【讨论】:
以上是关于Laravel Sanctum 突然令牌不匹配,仅在清除浏览器 cookie 后有效的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 CSRF 令牌与 Laravel 和 Sanctum 不匹配?
Vue + Laravel sanctum CSRF 令牌不匹配 419 错误
Laravel 7 Vue 2 Sanctum 登录错误 419; CSRF 令牌不匹配