我正在使用以下过程从Microsoft Graph请求访问令牌:
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
code
。获取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中这样做的,所以我认为这里的代码与此无关。
发布于 2022-10-25 15:57:24
正如@Nikolay所指出的,的令牌不能混合。微软的设计也很糟糕,例如,IMAP.AccessAsUser.All
无法用于IMAP访问--除非添加了https://outlook.office.com/
前缀,否则access_token就无法工作。
但是-我找到了的另一种方式,,它只用于读取用户的个人资料和电子邮件地址,这是通过解码id_token
。正如微软文档声明的那样,openid
、profile
和email
作用域将同时适用于图形和Outlook。profile
令牌可用于提取有关用户配置文件的信息。
如在:https://learn.microsoft.com/en-us/azure/active-directory/develop/id-tokens上解释的那样
id_token
包含电子邮件地址、名称等信息。
他们页面中的一个示例ID令牌是:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMVE16YWtpaGlSbGFfOHoyQkVKVlhlV01xbyJ9.eyJ2ZXIiOiIyLjAiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vOTEyMjA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkL3YyLjAiLCJzdWIiOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFJa3pxRlZyU2FTYUZIeTc4MmJidGFRIiwiYXVkIjoiNmNiMDQwMTgtYTNmNS00NmE3LWI5OTUtOTQwYzc4ZjVhZWYzIiwiZXhwIjoxNTM2MzYxNDExLCJpYXQiOjE1MzYyNzQ3MTEsIm5iZiI6MTUzNjI3NDcxMSwibmFtZSI6IkFiZSBMaW5jb2xuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiQWJlTGlAbWljcm9zb2Z0LmNvbSIsIm9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC02NmYzLTMzMzJlY2E3ZWE4MSIsInRpZCI6IjkxMjIwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsIm5vbmNlIjoiMTIzNTIzIiwiYWlvIjoiRGYyVVZYTDFpeCFsTUNXTVNPSkJjRmF0emNHZnZGR2hqS3Y4cTVnMHg3MzJkUjVNQjVCaXN2R1FPN1lXQnlqZDhpUURMcSFlR2JJRGFreXA1bW5PcmNkcUhlWVNubHRlcFFtUnA2QUlaOGpZIn0.1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw
令牌由3部分组成--头、有效负载和签名。它们被一个点隔开。这是一个标准JWT (JSON ),请参阅- 令牌中的详细信息
将它们分开后,然后对每个base64进行解码(签名在解码后不会给出任何有用的信息),结果如下:
1)头
{
"typ": "JWT",
"alg": "RS256",
"kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
}
2)有效载荷
包含用户信息的有效负载。在Azure中注册应用程序时,可以通过添加可选声明来提取其他信息-(左侧菜单中的令牌配置)。
{
"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)签名
只作核实之用。
1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw
发布于 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
,您也可以尝试从获得令牌的第一个授权调用中删除那个。
https://stackoverflow.com/questions/74157060
复制相似问题