首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CompactToken解析失败,错误代码: 8004920A

CompactToken解析失败,错误代码: 8004920A
EN

Stack Overflow用户
提问于 2022-10-21 17:11:07
回答 2查看 59关注 0票数 2

我正在使用以下过程从Microsoft Graph请求访问令牌:

  1. 我请求访问以下范围:

User.Read.All openid profile email offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send

  1. 在浏览器的同意屏幕上进行重定向,并将代码发送到运行在用户PC上的临时本地主机web服务器。
  2. 接收到的access_tokenrefresh_token交换为code
  3. 当我试图查询MicrosoftGraph获取用户配置文件时,我会查询:

获取https://graph.microsoft.com/v1.0/me

GET请求的标题包含:

Authorization: Bearer token-here-all-in-one-line

但是我得到了结果JSON:

"InvalidAuthenticationToken"

"CompactToken parsing failed with error code: 8004920A"

我通常假设令牌不正确,但我测试了来自C++应用程序和一个小型PHP的相同令牌,并且总是测试相同的错误。为了确保它不是错误的令牌,我故意将它修改为错误的令牌,然后得到:

"CompactToken parsing failed with error code: 80049217"

在googling之后- 8004920A的意思是“令牌拒绝”(我有问题的错误),而80049217的意思是“格式错误的令牌”,所以这与我故意插入虚假数据作为令牌是一致的。

因此,我假设令牌是正确的,但是Microsoft Graph拒绝它来查询同意和批准的用户配置文件信息。

我在IMAP和SMTP访问上测试了令牌,并在那里工作-邮件是发送和接收的,所以access_token绝对是好的。

想知道为什么微软图形拒绝我查询用户配置文件的尝试吗?

在AzureAD门户中注册应用程序时,是否需要启用某些功能?

我是从C++或PHP中这样做的,所以我认为这里的代码与此无关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-25 15:57:24

正如@Nikolay所指出的,的令牌不能混合。微软的设计也很糟糕,例如,IMAP.AccessAsUser.All无法用于IMAP访问--除非添加了https://outlook.office.com/前缀,否则access_token就无法工作。

但是-我找到了的另一种方式,,它只用于读取用户的个人资料和电子邮件地址,这是通过解码id_token。正如微软文档声明的那样,openidprofileemail作用域将同时适用于图形和Outlook。profile令牌可用于提取有关用户配置文件的信息。

如在:https://learn.microsoft.com/en-us/azure/active-directory/develop/id-tokens上解释的那样

id_token包含电子邮件地址、名称等信息。

他们页面中的一个示例ID令牌是:

代码语言:javascript
复制
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMVE16YWtpaGlSbGFfOHoyQkVKVlhlV01xbyJ9.eyJ2ZXIiOiIyLjAiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vOTEyMjA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkL3YyLjAiLCJzdWIiOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFJa3pxRlZyU2FTYUZIeTc4MmJidGFRIiwiYXVkIjoiNmNiMDQwMTgtYTNmNS00NmE3LWI5OTUtOTQwYzc4ZjVhZWYzIiwiZXhwIjoxNTM2MzYxNDExLCJpYXQiOjE1MzYyNzQ3MTEsIm5iZiI6MTUzNjI3NDcxMSwibmFtZSI6IkFiZSBMaW5jb2xuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiQWJlTGlAbWljcm9zb2Z0LmNvbSIsIm9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC02NmYzLTMzMzJlY2E3ZWE4MSIsInRpZCI6IjkxMjIwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsIm5vbmNlIjoiMTIzNTIzIiwiYWlvIjoiRGYyVVZYTDFpeCFsTUNXTVNPSkJjRmF0emNHZnZGR2hqS3Y4cTVnMHg3MzJkUjVNQjVCaXN2R1FPN1lXQnlqZDhpUURMcSFlR2JJRGFreXA1bW5PcmNkcUhlWVNubHRlcFFtUnA2QUlaOGpZIn0.1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw

令牌由3部分组成--有效负载签名。它们被一个点隔开。这是一个标准JWT (JSON ),请参阅- 令牌中的详细信息

将它们分开后,然后对每个base64进行解码(签名在解码后不会给出任何有用的信息),结果如下:

1)头

代码语言:javascript
复制
{
    "typ": "JWT",
    "alg": "RS256",
    "kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
}

2)有效载荷

包含用户信息的有效负载。在Azure中注册应用程序时,可以通过添加可选声明来提取其他信息-(左侧菜单中的令牌配置)。

代码语言:javascript
复制
{
    "ver": "2.0",
    "iss": "https://login.microsoftonline.com/9122040d-6c67-4c5b-b112-36a304b66dad/v2.0",
    "sub": "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ",
    "aud": "6cb04018-a3f5-46a7-b995-940c78f5aef3",
    "exp": 1536361411,
    "iat": 1536274711,
    "nbf": 1536274711,
    "name": "Abe Lincoln",
    "preferred_username": "AbeLi@microsoft.com",
    "oid": "00000000-0000-0000-66f3-3332eca7ea81",
    "tid": "9122040d-6c67-4c5b-b112-36a304b66dad",
    "nonce": "123523",
    "aio": "Df2UVXL1ix!lMCWMSOJBcFatzcGfvFGhjKv8q5g0x732dR5MB5BisvGQO7YWByjd8iQDLq!eGbIDakyp5mnOrcdqHeYSnltepQmRp6AIZ8jY"
}

3)签名

只作核实之用。

代码语言:javascript
复制
1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw
票数 0
EN

Stack Overflow用户

发布于 2022-10-21 17:49:12

不确定是否是这样,但可能是这样。不能对图形访问和另一个api访问使用相同的令牌(在您的示例中,比如)。也就是说,不能混合来自不同名称空间的作用域。不知道为什么(“按设计”?),你就是不能。你需要两个独立的令牌。

我在SharePoint REST访问方面也遇到了类似的问题(所以可能不能100%确定它也适用于Outlook访问,但可能也是如此)。我使用了一种相对简单的方法-- 交换令牌请求openid profile email offline_access作为服务器上https://outlook.office.com/...的令牌(使用on_behalf_of流)。

如果您真的不需要图形作用域User.Read.All,您也可以尝试从获得令牌的第一个授权调用中删除那个。

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

https://stackoverflow.com/questions/74157060

复制
相关文章

相似问题

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