Laravel Sanctum 突然令牌不匹配,只有在清除浏览器 cookie 后才有效
Laravel Sanctum suddenly token mismatch, only works after clearing browser cookies
我在使用 Laravel Sanctum 时遇到了一个奇怪的问题。我已经按照文档中的说明进行了配置,并且没有问题。
但有时它在尝试获取受保护的路线时开始发送 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 被清除或应用程序密钥被重置。
我的设置有什么问题吗?或者您认为这只是本地行为?
任何建议都会有所帮助。
问题是您的令牌会在您的配置中指定的特定时间后过期。这也可能发生在生产版本中。
我假设您是在本地注意到了这个问题,而不是因为您正在测试您的应用程序并且令牌在那一刻即将过期。
我会将令牌过期时间设置为一小时,并每 50 分钟在您的 SPA 后台更新一次访问令牌。这可以防止当前正在使用该网站的用户被注销。
如果用户在一定时间后返回站点并且在他们的 cookie 中有一个过期的令牌并且您的路由发回代码 419,您可以通过 axios interceptor 响应错误并删除来自浏览器 cookie 的过期令牌并向用户显示登录 window.
我在使用 Laravel Sanctum 时遇到了一个奇怪的问题。我已经按照文档中的说明进行了配置,并且没有问题。
但有时它在尝试获取受保护的路线时开始发送 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 被清除或应用程序密钥被重置。
我的设置有什么问题吗?或者您认为这只是本地行为?
任何建议都会有所帮助。
问题是您的令牌会在您的配置中指定的特定时间后过期。这也可能发生在生产版本中。
我假设您是在本地注意到了这个问题,而不是因为您正在测试您的应用程序并且令牌在那一刻即将过期。
我会将令牌过期时间设置为一小时,并每 50 分钟在您的 SPA 后台更新一次访问令牌。这可以防止当前正在使用该网站的用户被注销。
如果用户在一定时间后返回站点并且在他们的 cookie 中有一个过期的令牌并且您的路由发回代码 419,您可以通过 axios interceptor 响应错误并删除来自浏览器 cookie 的过期令牌并向用户显示登录 window.