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
相关产品推荐
相关产品推荐

