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

