使用Azure ADB2C与MSAL,无需重登如何刷新含自定义声明的Bearer令牌?
解决方案:无需登出更新ADB2C Bearer令牌中的自定义声明
要实现添加新实例后无需登出重新登录即可更新extension_InstancesAvailable声明,核心是利用**刷新令牌(Refresh Token)**触发静默令牌刷新流程,同时确保ADB2C的API连接器在刷新时重新执行,返回最新的实例列表。
关键步骤
1. 确认ADB2C配置兼容性
确保你的用户流和API连接器配置满足:
- 用户流允许使用刷新令牌(ADB2C默认启用,可在用户流的"令牌"设置中确认)
- 绑定的API连接器处于**"在令牌中包含应用声明之前(预览版)"**阶段,该阶段在刷新令牌请求新令牌时会被触发,因此你的API端点会被重新调用以获取最新的实例数据
2. 在React应用中触发静默令牌刷新
使用MSAL.js的acquireTokenSilent方法,该方法会自动利用当前缓存的刷新令牌向ADB2C请求新的ID/访问令牌,全程无需用户交互(包括无需输入密码)。
示例代码(基于MSAL React):
import { useMsal } from "@azure/msal-react"; const refreshInstanceClaims = async () => { const { instance, accounts } = useMsal(); const activeAccount = accounts[0]; if (!activeAccount) return; const tokenRequest = { account: activeAccount, scopes: ["openid", "profile", "api://your-client-id/your-scope"], // 替换为你的应用作用域 }; try { // 静默获取新令牌 const response = await instance.acquireTokenSilent(tokenRequest); // 从新ID令牌中提取更新后的实例列表 const updatedInstances = response.idTokenClaims.extension_InstancesAvailable; // 更新应用状态(比如存入React State) console.log("已更新实例列表:", updatedInstances); } catch (error) { // 处理静默刷新失败的情况(如刷新令牌过期) if (error.name === "InteractionRequiredAuthError") { // 触发无密码的交互流程(如弹出式登录,SSO会自动完成认证) await instance.acquireTokenPopup(tokenRequest); } else { console.error("令牌刷新失败:", error); } } };
3. 验证API连接器逻辑
确保你的API端点在被调用时,是实时获取最新的用户实例列表(比如从数据库读取),而不是返回缓存数据,这样才能保证新令牌中的extension_InstancesAvailable包含刚添加的实例。
注意事项
- 刷新令牌有效期:ADB2C默认刷新令牌有效期为90天,可在用户流设置中调整。只要刷新令牌有效,就能反复触发静默刷新。
- 交互 fallback:如果静默刷新失败(如刷新令牌过期、用户长时间未操作),
acquireTokenPopup/acquireTokenRedirect会触发SSO流程,用户无需重新输入密码即可完成认证。 - 令牌缓存:MSAL会自动更新本地缓存中的令牌,后续API请求会自动使用新令牌,无需手动替换。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

