我正在使用此过程从Microsoft Graph请求访问令牌:
1.我请求访问以下作用域:code
1.在Web浏览器中的同意屏幕后,发生重定向,代码被发送到在用户PC上运行的临时本地主机Web服务器。
1.接收到的code
与访问令牌和刷新令牌进行交换
1.当我尝试在Microsoft Graph中查询使用者设定档时,我查询到:
掘地工具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"
在谷歌搜索后-8004920A
意味着“令牌被拒绝”(我遇到的错误),80049217
意味着“格式错误的令牌”,所以这与我故意插入虚假数据作为令牌是一致的。
因此,我会假设令牌是正确的,但Microsoft Graph拒绝它来查询已同意和批准的用户配置文件信息。
我已经在IMAP和SMTP访问上测试了令牌,它在那里工作-邮件被发送和接收,所以X1 M9 N1 X绝对是好的。
知道为什么Microsoft Graph拒绝我查询用户配置文件的尝试吗?
在AzureAD门户中注册应用程序时,我是否需要启用某些功能?
我是从C或PHP做这件事的,所以我不认为这里的代码是相关的。
2条答案
按热度按时间0tdrvxhp1#
不确定是否是这种情况,但可能是。您不能将同一个令牌用于图形访问和另一个API访问(例如Outlook REST api)。这意味着,您不能混合不同名称空间的作用域。不确定为什么(“设计”?),您就是不能。您需要两个单独的令牌。
我在SharePoint REST api访问中遇到了类似的问题(所以可能不能100%确定Outlook也是如此,但可能是这样)。我使用了一个相对简单的解决方法-exchanging the token请求
openid profile email offline_access
,以获得服务器上https://outlook.office.com/...
的令牌(使用on_behalf_of
流)。如果您真的不需要图作用域
User.Read.All
,您也可以尝试简单地从获取令牌的第一个授权调用中删除该作用域。sg24os4d2#
正如@Nikolay所说,Graph和Outlook的令牌不能混合使用,而且微软的设计很糟糕,例如
IMAP.AccessAsUser.All
不能用于IMAP访问--access_token只有在添加了https://outlook.office.com/
前缀后才能正常工作。但是-我发现了另一种方法,它只用于阅读用户的配置文件和电子邮件地址,这是通过解码
id_token
。正如微软文档所述-openid
、profile
和email
范围将与Graph和Outlook一起工作。profile
令牌可用于提取有关用户配置文件的信息。如上所述:https://learn.microsoft.com/en-us/azure/active-directory/develop/id-tokens
id_token
包含电子邮件地址、姓名等信息。他们页面中的ID标记示例如下:
令牌由三部分组成-头、负载和签名。它们由点分隔。这是标准的JWT(JSON Web令牌)。请参阅-https://en.wikipedia.org/wiki/JSON_Web_Token中的详细信息
在将它们分离并对每个进行base64解码之后(签名在解码之后不会给出任何有用的信息),结果为:
1)标题
2)有效负载
包含用户信息的负载。可以通过在Azure AD中注册应用程序时添加可选声明来提取其他信息-(令牌配置位于左侧菜单中)。
3)签名
仅用于验证目的。