如何解决带有 msal-react 包装的 msal-browser 无法从缓存中获取访问令牌
@azure/msal-browser 2.14.1 @azure/msal-react 1.0.0-beta.2
我们正在使用自定义 b2c 政策
当我使用 PublicClientApplication 的实例调用 AcquireTokenSilent 时,它没有从缓存中获取访问令牌,但我可以看到访问令牌存储在 sessionStorage 中,看起来像 {homeAccountId}-{tenantSubdomain}.b2clogin.com-AccessToken-{aud}-{tid}
。与 refreshToken、clientInfo 和 idToken 一起使用类似的格式。它确实按预期从端点成功返回令牌。
在 B2C 重定向 uri 设置为 SPA 并禁用隐式流
配置:
const config = {
auth: {
clientId: applicationID,authority: signInAuthority,knownAuthorities: [
`${tenantSubdomain}.b2clogin.com`,],redirectUri: reactRedirectUri,validateAuthority: false,navigateToLoginRequestUrl: false,postLogoutRedirectUri: reactRedirectUri,},system: {
loggerOptions: {
loggerCallback: (level,message,containsPii) => {
if (containsPii) {
return;
}
switch (level) {
case LogLevel.Error:
console.error(message);
return;
case LogLevel.Info:
console.info(message);
return;
case LogLevel.Verbose:
console.debug(message);
return;
case LogLevel.Warning:
console.warn(message);
return;
}
},piiLoggingEnabled: false,windowHashTimeout: 60000,iframeHashTimeout: 6000,loadFrameTimeout: 0,tokenRenewalOffsetSeconds: 1,// allowRedirectInIframe: true,cache: {
cacheLocation: "sessionStorage",storeAuthStateInCookie: true,};
请求:
const signInRequest = {
scopes: [
msalInstance.config.auth.clientId,};
const silentRefreshRequest = {
scopes: [
msalInstance.config.auth.clientId,};
offline_access、openid 和 profile 会自动添加到请求中,我已经尝试了这些范围的许多不同变体。
acquireTokenSilent:
const res = await msalInstance.acquireTokenSilent({
...silentRefreshRequest,account: msalInstance.getActiveAccount(),});
我再次尝试了一些不同的变体。有什么我遗漏的东西可以解决从缓存中获取它的问题,还是我只需要解决它?
解决方法
在使用 B2C 时请求您自己的 clientId 作为范围时,这是一个已知问题。 B2C 服务返回“/”的“范围”值,而不是破坏缓存的 clientId。他们正在修复,但现在要解决这个问题,您应该在您的应用程序注册中创建一个自定义范围并改用它。您可以跟踪 this issue,以便在修复程序推出时收到通知。
,对于任何遇到相同问题的人,Thomas 是正确的,请检查此 article 以创建自定义范围,然后将该范围放入您的请求中:
const signInRequest = {
scopes: ["xxx/api/user.read"],};
const silentRefreshRequest = {
scopes: ["xxx/api/user.read"],};
它似乎解决了从缓存中检索令牌时的作用域问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。