MSAL.js中Token响应缺失offline_access Scope问题求助
Outlook加载项MSAL.js中offline_access scope不显示、无法获取刷新令牌的解决办法
确认MSAL.js版本与授权流程兼容性
MSAL.js v2及以上版本中,offline_access属于隐式请求的权限,但只有**首次交互式登录(比如loginPopup、loginRedirect)**时才会颁发刷新令牌。后续静默请求或非首次交互式请求,刷新令牌会被自动缓存,但不会出现在响应的scopes字段里。如果用的是v1.x版本,必须显式在请求scopes里加offline_access,而且得是交互式请求——静默请求拿不到刷新令牌。检查Azure AD应用注册配置
- 确认应用注册的「认证」标签下,重定向URI是Outlook加载项对应的地址(格式一般是
https://outlook.office.com/owa/[你的域名]/[加载项ID]/auth.html),类型选SPA或Web,匹配你的加载项类型。 - 「API权限」里,
offline_access必须是已同意的状态:租户内应用要管理员同意,个人账号要用户自己同意。注意offline_access是委托权限,必须完成同意流程。
- 确认应用注册的「认证」标签下,重定向URI是Outlook加载项对应的地址(格式一般是
调整令牌请求逻辑
- 把
tokenRequest里的prompt: "select_account"和forceRefresh: true去掉,除非你确实需要强制用户重新选账号——频繁用forceRefresh会干扰刷新令牌的缓存逻辑。 - 首次登录必须用
loginPopup或loginRedirect,而且loginRequest里要包含offline_access。只有首次交互式登录才会触发刷新令牌颁发,之后用acquireTokenSilent时,MSAL会自动用缓存的刷新令牌获取新访问令牌。 - 可以调整你的
getTokenPopup函数,先完成首次登录再获取令牌:// 首次登录并获取令牌的逻辑 function loginAndGetToken(myMSALObj) { return myMSALObj.loginPopup(loginRequest) .then(loginResponse => { console.log("首次登录完成,刷新令牌已缓存"); return getTokenPopup(tokenRequest, myMSALObj, loginResponse.account.username); }); }
- 把
正确读取缓存与令牌响应
MSAL.js会自动把刷新令牌存在localStorage或sessionStorage(看你配置),不会在acquireTokenPopup或acquireTokenSilent的响应里直接返回。你不用手动提取刷新令牌,MSAL会自动处理令牌刷新的逻辑。另外,响应里的scopes字段只会显示资源权限(比如User.Read),offline_access是特殊权限,不会出现在这个列表里——只要首次请求加了且用户同意,刷新令牌就已经在缓存里了。适配Outlook加载项的沙盒限制
Outlook加载项运行在Office沙盒里,部分存储API有限制。确保cacheLocation设为localStorage,storeAuthStateInCookie设为true,兼容Office环境。同时检查manifest.xml里的WebApplicationInfo节点配置正确:<WebApplicationInfo> <Id>你的ClientId</Id> <Resource>https://outlook.office.com</Resource> <Scopes> <Scope>User.Read</Scope> <Scope>Mail.ReadWrite</Scope> <Scope>offline_access</Scope> </Scopes> </WebApplicationInfo>
内容的提问来源于stack exchange,提问作者Waqar
相关产品推荐
相关产品推荐

