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

Microsoft Graph API令牌验证失败

锺英彦
2023-03-14

我会在我的Angular Web应用程序中使用Microsoft Graph API。

首先,我使用msal库进行连接 当我尝试使用我的profil登录时,我收到此错误

我已将我的应用程序配置为官方git示例中提到的应用程序

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true
}),

认证有效,我得到了令牌。

然后,当我在主页时,我向微软图形API发出第二个请求,以使用该令牌获取用户信息。

getProfile() {
  let header= new Headers();
  let tokenid= sessionStorage.getItem('msal.idtoken'); 
  header.set('Authorization', 'Bearer ' + tokenid)
  let url ="https://graph.microsoft.com/v1.0/me/"
  return this.http.get(url,{headers:header});
}

}

我得到一个401未经授权的错误,并回复:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.",
    "innerError": {
      "request-id": "xxxxxx",
      "date": "2018-10-09T22:58:41"
    }
  }
}

我不知道为什么MG API不接受我的代币,我是否使用了错误的权限url?

更新:我已经明白,实际上我得到的id_token不同于访问令牌。我如何从MSAL库获得访问令牌来调用MS GRAPH API?:

共有3个答案

缪升
2023-03-14

请确保将终结点添加到资源映射配置。请参阅此链接: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/MSALAngularDemoApp

export const protectedResourceMap:[string, string[]][]=[ ['https://graph.microsoft.com/v1.0/me', ['user.read']] ];
庄高谊
2023-03-14

问题是您使用的是id_token而不是访问令牌:

让tokenid=sessionStorage.getItem('msal.idtoken')

变成这样:

让Tokenid=sessionStorage.getItem('msal.token '); // 或msal.accesstoken

更新(根据菲利普的评论)

您需要选择要在应用程序中定位的作用域。因此,看起来您需要用户配置文件,因此您需要添加“同意范围”属性以指定应用程序将使用的范围:

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true,
  consentScopes: ["user.read"]
}),

柴嘉石
2023-03-14

根据同一示例,您还可以附加一个HttpInterceptor,该将自动将访问令牌附加到每个(外部)HTTP调用。

通过阅读文档,我发现了以下信息。

consentScopes:允许客户端表达应该同意的期望范围。范围可以来自多个资源/endpoint。在这里传递作用域只会同意它,并且在客户机实际调用API之前不会获得任何访问令牌。如果您仅使用MSAL进行登录(身份验证),这是可选的。

这表明使用< code>HttpInterceptor不仅可以附加访问令牌,还可以检索它。您看到的令牌可能只是您的应用程序的令牌,但不是Graph API的有效令牌。

在内部,它使用<code>getCachedTokenInternal(作用域:数组

您可以尝试复制访问令牌,并查看它在 jwt.ms(Microsoft 提供的 JWT 令牌查看器)或 jwt.io 上的外观。

对Graph有效的任何令牌都应该具有https://graph.microsoft.com的Audience,因此如果您检查令牌(jwt.ms),它至少应该具有此值。

"aud": "https://graph.microsoft.com",
 类似资料:
  • 通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者 可以全局设置开启令牌验证: <!--随机token令牌,使用UUID生成--> <dubbo:provider interface="com.foo.BarService" token="true" /> 或 <!--固定token令牌,

  • 问题内容: 我正在努力验证Azure AD令牌签名。 当我在下面的“ jwks_uri”字段中查找正确的键描述时 https://login.microsoftonline.com/common/.well-known/openid- configuration 我检查所属密钥数据。 我尝试使用“ n”-模数和“ e”字段生成用于签名验证的公钥,但最终出现错误: 安慰: 我尝试了另一种使用“ x5

  • 问题内容: 我在CSRF令牌方面遇到问题。当我提交表单时,正在生成一个新的表单,但是我想我正在生成两个不同的令牌,这有点困惑。还有一个名为的令牌,因此我在开发人员工具中看到了两个不同的cookie(XSRF- TOKEN和_csrf),发布后它们没有变化。 我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效。我知道为了安全起见应该这样做,但是我坚持了下来。 漫长的一天,我是Express和

  • 我有一个令牌,它将从一个服务传递到我的Rest服务。我想使用Spring security根据公钥验证令牌(它托管在不同的服务器上)。我已经定义了安全配置类,它扩展了KeyDopperWebSecurity配置适配器,并且实现了httpSecurity和AuthenticationManager构建器。 我正在使用OncePerRequestFilter并从请求中获取承载令牌。 @组件公共类Jwt

  • 我正在尝试构建一个可以与azure web app通信的VSTS扩展。我能够做到这一点,但没有身份验证。我指的是Microsoft文档。 我获取了从浏览器即控制台生成的令牌。登录(令牌)并在此网站中验证。 上面写着无效的签名。 所提到的逻辑。Net framework验证生成的令牌无效。它给了我以下错误: IDX10500:签名验证失败。无法解析SecurityKeyIdentifier:“Sec

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