Outlook IMAP作用域使用新的MS Graph API进行身份验证失败

Outlook IMAP作用域使用新的MS Graph API进行身份验证失败,outlook,oauth,microsoft-graph-api,imap,Outlook,Oauth,Microsoft Graph Api,Imap,我请求以下作用域(URL编码): OAuth 2.0使用新的Microsoft Graph API的授权过程似乎运行良好,但当使用access令牌通过XOAuth2连接到IMAP时,我得到一个无身份验证,这表明令牌无效。结果表明,这不是用户的问题,而是Microsoft Graph API的问题。虽然没有文档记录,但当前不允许您请求范围在两个租户之下的令牌,否则它将选择一个,并以静默方式失败 在本例中,User.Read属于Microsoft图形租赁。从技术上讲,如果您的用户是组织Outlook

我请求以下作用域(URL编码):


OAuth 2.0使用新的Microsoft Graph API的授权过程似乎运行良好,但当使用access令牌通过XOAuth2连接到IMAP时,我得到一个
无身份验证
,这表明令牌无效。

结果表明,这不是用户的问题,而是Microsoft Graph API的问题。虽然没有文档记录,但当前不允许您请求范围在两个租户之下的令牌,否则它将选择一个,并以静默方式失败

在本例中,
User.Read
属于Microsoft图形租赁。从技术上讲,如果您的用户是组织Outlook/Office365用户,他们可能实际上没有安装Microsoft Graph,正确的范围是
https://outlook.office.com/User.Read
但是Outlook配置文件终结点已被弃用,不建议使用(您也无法知道您的用户是否拥有MS Graph租约)。似乎可以解决这个问题,可以请求
用户.read
权限,而无需指定Microsoft Graph URL

这基本上就是您在上面所做的,但可能会产生误导,因为您实际上并没有请求普通用户的“读取”权限,然后可以将该权限解析为Outlook租户。实际发生的是User.Read权限被映射到某个默认租户,因此您的作用域实际上包含多个租户(默认租户和Outlook)

因为这是不允许的,所以它会自动失败并默认为默认租户。对于他们的大多数API,这仍然有效,但特别是对于IMAP/SMTP,您无法请求更大的作用域/多租户密钥,否则将无法通过XOAuth2进行验证。您将注意到,仅为IMAP/SMTP返回的访问令牌总是比其他作用域的访问令牌小得多

要解决此问题,您需要请求两个访问令牌。首先,您应该使用授权码在以下范围内请求密钥:

offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send
user.read
接下来,您需要为概要文件请求访问令牌。但是,从2020年10月起,您不再允许使用单一授权代码进行多址令牌授权。因此,您将需要再次登录用户——执行此操作的标准方法是简单地将用户导航回auth URL,将
login\u hint
字段留空。这取决于您构建URL的方式,但以下是JS中的一个示例:

url='1〕https://login.microsoftonline.com/common/oauth2/v2.0/authorize?'
url+=`client_id=${clientId}`
url+='&响应类型=代码'
url+='&redirect_uri=${redirectURI}'
url+='&响应模式=查询'
url+='&登录\u提示='
url+='&scope=offline_访问%20User.Read%20https%3A%2F%2fooutlook.office.com%2FIMAP.accessUser.All%20https%3A%2F%2fooutlook.office.com%2fmtp.Send'
url+='&状态=12345
请注意,对于这两个访问令牌请求,您的授权代码必须请求完整范围(包括
User.Read
和IMAP范围,如
IMAP.accessUser.All
指定较小范围不能保证您读取的配置文件必然与Outlook帐户对应

在收到第二个授权代码后(它不会要求用户再次手动登录,只需加载一点并自动解析第二个代码),您可以请求具有以下范围的新访问令牌:

offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send
user.read
您可以包括上面的任何其他图形API作用域,但在Outlook下,特别是在IMAP下指定某些内容会混淆您的作用域。响应作用域仍将包含EAS access和Outlook作用域,但添加了
用户.read
权限

您应该使用第二个令牌访问配置文件,并将其与第一个令牌(仅用于IMAP/SMTP)分开刷新