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 令牌不匹配

Laravel Sanctum Token API 身份验证在 Postman 中不起作用

反应前端中的 CSRF 令牌不匹配

Laravel Sanctum auth:sanctum 路由允许在没有承载令牌的情况下访问