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.