我遇到了一个关于Laravel Sanctum的奇怪的问题。我已经按照文档中的说明对其进行了配置,它可以正常工作。
但有时它在尝试获取受圣殿保护的路由时开始发送419错误,并且仅在清除浏览器cookie或重置应用程序密钥(php artisan key:generate)后才起作用。
我只在具有本地域的本地环境中发生过这种情况(webapp.test由主机文件路由,由Apache webserver提供服务),但我担心这种情况会发生在生产服务器上。
我的.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被清除或应用程序密钥被重置。
我的设置中有什么问题吗?或者你认为这只是一个本地行为?
任何建议都会有所帮助。
发布于 2021-10-03 20:31:50
问题是您的令牌在配置中指定的特定时间后过期。这也可能发生在生产版本中。
我假设您在本地注意到了这个问题,而不是因为您正在测试您的应用程序,而令牌在那个时刻即将到期。
我会将令牌过期时间设置为一小时,并在您的SPA后台每50分钟更新一次访问令牌。这可以防止当前正在使用该网站的用户被注销。
如果用户在一段时间后返回站点,并且其cookies中有过期的令牌,并且您的路由返回代码419,则您可以通过axios interceptor响应此错误,并从浏览器cookies中删除过期的令牌,并向用户显示登录窗口。
https://stackoverflow.com/questions/68956375
复制相似问题