首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >msal-带有msal-react包装器acquireTokenSilent的浏览器无法从缓存中获取访问令牌

msal-带有msal-react包装器acquireTokenSilent的浏览器无法从缓存中获取访问令牌
EN

Stack Overflow用户
提问于 2021-04-30 09:18:33
回答 2查看 668关注 0票数 0

@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,且隐式流被禁用

配置:

代码语言:javascript
复制
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,
  },
};

请求:

代码语言:javascript
复制
const signInRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};

const silentRefreshRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};

offline_access、openid和profile会自动添加到请求中,我在这些作用域上尝试了许多不同的变体。

acquireTokenSilent:

代码语言:javascript
复制
const res = await msalInstance.acquireTokenSilent({
            ...silentRefreshRequest,
            account: msalInstance.getActiveAccount(),
          });

我再一次尝试了几种不同的变体。有没有我遗漏的东西可以解决从缓存中获取它的问题,或者我只是需要解决它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-01 00:15:18

当在使用B2C时请求自己的clientId作为作用域时,这是一个已知问题。B2C服务返回"scope“值"/”,而不是中断缓存的clientId。他们正在努力修复,但现在要解决这个问题,你应该在你的应用注册上创建一个自定义作用域,并使用它。您可以跟踪this issue,以便在修复程序推出时收到通知。

票数 1
EN

Stack Overflow用户

发布于 2021-05-03 09:28:00

对于任何有相同问题的人,Thomas是正确的,请查看此article以创建自定义作用域,然后将该作用域放入请求中:

代码语言:javascript
复制
const signInRequest = {
  scopes: ["xxx/api/user.read"],
};

const silentRefreshRequest = {
  scopes: ["xxx/api/user.read"],
};

它似乎修复了从缓存中检索令牌时的作用域问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67327004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档