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

使用@azure/msal-node获取AccessToken时缓存刷新令牌报错求助

解决步骤

1. 修正TokenCache的配置位置

你的代码中把tokenCache放在了auth配置对象内,这是错误的。MSAL Node的tokenCache是与auth同级的顶级配置项,调整如下:

const tokenCache = new msal.TokenCache();
// 先导入缓存数据到tokenCache实例,再传入CCA
const cca = new msal.ConfidentialClientApplication({
  auth: {
    clientId: '你的客户端ID',
    clientSecret: '你的客户端密钥',
  },
  tokenCache: tokenCache // 顶级属性,不在auth内
});

2. 正确导入数据库中的缓存数据

不要直接传递原始缓存对象,需通过TokenCache实例的deserialize方法导入完整的缓存数据(包含accounts、refreshTokens等所有缓存项):

// 从数据库获取完整的序列化缓存字符串(建议整体存储缓存,而非拆分account和token)
const [cacheResult] = await promiseConnection.query('SELECT token_cache FROM your_table WHERE user_id = ?', [userId]);
const serializedCache = cacheResult[0].token_cache;

// 初始化TokenCache并导入数据
const tokenCache = new msal.TokenCache();
tokenCache.deserialize(serializedCache);

3. 确保账户对象来自缓存而非单独存储的account数据

单独存储的account对象可能无法与缓存中的refresh token关联,应直接从初始化后的TokenCache中获取账户:

// 从缓存中加载账户
const accounts = await cca.getTokenCache().getAllAccounts();
if (accounts.length === 0) {
  // 缓存中无有效账户,需触发登录流程
  console.log('无有效账户,请重新登录');
  return;
}

// 使用缓存中的账户调用acquireTokenSilent
try {
  const result = await cca.acquireTokenSilent({
    scopes: ['calendars.readWrite'],
    account: accounts[0], // 选择对应账户
  });
  console.log(result.accessToken);
} catch (error) {
  console.log(error);
  // 静默获取失败,触发交互式登录
}

4. 检查缓存存储的完整性

确保你存储到数据库的是完整的TokenCache序列化字符串,而非仅存储account或refresh token的部分数据。可以在首次获取令牌后,通过tokenCache.serialize()获取完整缓存字符串并存储:

// 登录成功后,获取完整缓存并存储到数据库
const loginResult = await cca.acquireTokenByCode(...); // 或其他登录方式
const serializedCache = cca.getTokenCache().serialize();
// 将serializedCache存入数据库
await promiseConnection.query('INSERT INTO your_table (token_cache) VALUES (?)', [serializedCache]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:01