当前位置: 首页 > 知识库问答 >
问题:

Microsoft Graph API auth错误:“访问令牌验证失败。访问群体无效”

龙弘盛
2023-03-14

好的,我已经花了两天的时间来解决这个错误,并找到了一个解决方案。在我的搜索中,我没有找到一个单一的答案来解决我所面临的问题(相反,我找到了多个最终指向解决方案的答案)。因此,我尝试向您解释“访问令牌验证失败。无效访问群体”错误的解决方案:

TLDR:

  • 检查“https://graph.Microsoft.com”在https://jwt.ms/上与MSAL进行身份验证时收到的访问令牌中是否作为AUD(观众)列出(Microsoft位于jwt.ms站点后面,源码:https://docs.Microsoft.com/en-us/azure/active-directory/developer/access-tokens)。在我的例子中,列出的是后端API范围,而不是“https://graph.microsoft.com”。这就是为什么Microsoft graph api检查访问令牌时“访问群体”无效。
  • 解决方案是请求两个不同的访问令牌,一个用于后端范围,另一个用于https://graph.microsoft.com/user。读取范围:
/**
 * Retrieve token for backend
 */
export const getToken = async (account): Promise<AuthenticationResult> => {
  return await msalInstance.acquireTokenSilent({
    scopes: [process.env.REACT_APP_API_SCOPE as string],
    redirectUri: current_url,
    account,
  });
};

/**
 * Retrieve token for Microsoft Graph API:
 */
export const getTokenForGraphApi = async (
  account
): Promise<AuthenticationResult> => {
  return await msalInstance.acquireTokenSilent({
    scopes: ["https://graph.microsoft.com/User.Read"],
    redirectUri: current_url,
    account,
  });
};

我已经让我的组织的管理员设置了Azure门户,以便我们的应用程序注册具有API权限:

  • 后端API权限
  • Microsoft图形
    • “用户。阅读”
    • “user.readbasic.all”。

    在React中,当我进行身份验证时,我使用了作用域:

    scopes: [
        process.env.REACT_APP_API_SCOPE as string,
        "User.Read",
    ],
    

    然后,我尝试使用“https://graph.microsoft.com”在user.read作用域之前进行操作,所以它应该是:

    scopes: [
        process.env.REACT_APP_API_SCOPE as string,
        "https://graph.microsoft.com/User.Read"
    ],
    
    

    但未能通过错误消息进行身份验证:

    “AADSTS28000:为输入参数scope提供的值无效,因为它包含多个资源。scope api://{API-application-id}/a-scope https://graph.microsoft.com/user。读取openid配置文件无效。”

    /**
     * Retrieve token for backend
     */
    export const getToken = async (account): Promise<AuthenticationResult> => {
      return await msalInstance.acquireTokenSilent({
        scopes: [process.env.REACT_APP_API_SCOPE as string],
        redirectUri: current_url,
        account,
      });
    };
    
    /**
     * Retrieve token for Microsoft Graph API:
     */
    export const getTokenForGraphApi = async (
      account
    ): Promise<AuthenticationResult> => {
      return await msalInstance.acquireTokenSilent({
        scopes: ["https://graph.microsoft.com/User.Read"],
        redirectUri: current_url,
        account,
      });
    };
    
    

共有1个答案

单于越
2023-03-14

错误消息:“access token validation Failure.Invalid Audiator”告诉您,在Microsoft Graph API中使用的访问令牌上的“AUD”(Audiator)设置不正确。

通过粘贴访问令牌,可以使用https://jwt.ms/检查令牌。(Microsoft支持站点jwt.ms站点:https://docs.Microsoft.com/en-us/azure/active-directory/developer/access-tokens)

因此,解决方案需要两个独立的访问令牌:一个范围为“https://graph.Microsoft.com/user.read”,您可以与Microsoft graph api一起使用,另一个用于后端的访问令牌:

/**
 * Retrieve token for backend
 */
export const getToken = async (account): Promise<AuthenticationResult> => {
  return await msalInstance.acquireTokenSilent({
    scopes: [process.env.REACT_APP_API_SCOPE as string],
    redirectUri: current_url,
    account,
  });
};

/**
 * Retrieve token for Microsoft Graph API:
 */
export const getTokenForGraphApi = async (
  account
): Promise<AuthenticationResult> => {
  return await msalInstance.acquireTokenSilent({
    scopes: ["https://graph.microsoft.com/User.Read"],
    redirectUri: current_url,
    account,
  });
};

 类似资料:
  • 我正在尝试使用Graph API从Angular应用程序发送邮件。 下面是代码 但当我发送邮件时,我会收到以下错误。 我使用参考资料中的作用域:['mail.send'],但仍然会出现此错误。此外,我仅使用来自this.msalService.AcquireTokenSilent(资源)的accessToken。

  • 在错误=我正在获取“消息”的上下文中需要帮助:“Access token validation Failure.Invalid Pavior.”, 我正在使用OAuth中的授权代码授予类型。我已经使用Azure广告策略将自定义声明映射到应用程序。因此,如果用户Scope=appid/.default,那么我将在令牌中获得一个自定义声明,并在Azure AD上对应用程序具有API权限,如user.r

  • null null “AADSTS28000:为输入参数scope提供的值无效,因为它包含多个资源。scope api://{API-application-id}/a-scope https://graph.microsoft.com/user。Read openid配置文件无效。” 这里,我们的后端是一个资源,它有一个作用域,“https://graph.microsoft.com”是另一个作

  • 当且仅当用户在发出OAuth2请求时登录到LinkedIn时,它才起作用。 如果用户未登录,则会遇到错误。 我们的行动顺序: 成功获取新的访问令牌 使用访问令牌,发布到apiendpoint 之后,我们将收到一份401,内容如下: 有时,经过一段时间后,使用相同的访问令牌重试会得到200。有时不会。 如果用户在“401期间”登录LinkedIn,那么之前获取的访问令牌就会神奇地开始工作。 我不知道

  • 我在谷歌上搜索了很多关于这个问题的信息,但没有任何帮助。我也看到过许多类似的帖子,但没有什么用处。 我正在使用MS Graph API V2访问用户电子邮件、日历和联系人数据。 授权URL: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=ABC 令牌请求URL: https://login.micr

  • 我感到困惑的是,在向授权服务器发送授权请求时,似乎没有标准的方法来指定访问令牌的受众。 OAuth2将访问令牌指定为不透明字符串;规范中只有一处提到了“观众”,即访问令牌可以是“观众限制的”。许多最近的授权服务器实现似乎产生了JWT访问令牌,JWT指定了受众(aud)声明。 据我所知:-Auth0使用“audience”参数-Connect2id使用“resource”参数-Identity Se