You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Directus新SDK登录无refresh token、logout失败问题咨询

Directus新SDK可组合客户端:登录无Refresh Token、登出报错问题排查

一、登录无Refresh Token的原因

你使用的authentication()默认启用Cookie认证模式,这种模式下Directus会把refresh token存储在HttpOnly类型的Cookie中(也就是你看到的那几个十六进制Cookie),不会在login()的返回结果里暴露refresh token——这是设计逻辑,目的是通过HttpOnly Cookie降低XSS攻击风险。

如果需要让login()返回refresh token,需显式指定JSON认证模式,修改实例创建代码:

const directus = createDirectus(import.meta.env.VITE_DIRECTUS_URL)
  .with(authentication('json')) // 指定JSON模式
  .with(rest());

切换到JSON模式后,你需要自行管理access token和refresh token的存储(比如存在localStorage或Svelte store),后续请求也需要手动携带这些令牌。

二、登出logout()报错的原因

你每次调用getDirectusInstance()都会创建全新的Directus实例,新实例无法读取之前登录时存在HttpOnly Cookie里的refresh token,也未保存任何认证状态。调用logout()时,后端需要验证refresh token完成登出流程,但新实例无法提供该令牌,因此抛出「refresh token缺失」的错误。

解决方案:复用同一个Directus实例

不要每次登录/登出都新建实例,而是创建全局复用的实例,让它自动维护认证状态:

// directus.js
import { createDirectus, authentication, rest } from '@directus/sdk';

// 创建全局实例,整个应用复用
const directus = createDirectus(import.meta.env.VITE_DIRECTUS_URL)
  .with(authentication())
  .with(rest());

export function getDirectusInstance(fetch) {
  // 服务端渲染场景需自定义fetch时,扩展实例但保留核心状态
  if (fetch) {
    return directus.withGlobals({ fetch });
  }
  return directus;
}

之后登录、登出统一使用这个复用的实例:

// 登录逻辑
const directus = getDirectusInstance();
const data = await directus.login(email, password);

// 登出逻辑
const directus = getDirectusInstance();
await directus.logout();

复用实例后,它会自动处理Cookie中的refresh token,调用logout()时会自动将令牌传给后端,完成登出流程。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:07:45