为何无法获取同时兼容IMAP与Microsoft Graph的Outlook访问令牌?
解决同时请求Graph与IMAP/SMTP Scope时的invalid_scope错误
问题原因
Microsoft OAuth 2.0 v2.0端点不允许在同一个访问令牌请求中混合两类不同的scope:
- Microsoft Graph专属scope:比如
Contacts.Read、Contacts.Read.Shared这类,对应资源是https://graph.microsoft.com - Exchange协议专属scope:比如
https://outlook.office.com/IMAP.AccessAsUser.All、https://outlook.office.com/SMTP.Send这类,对应资源是https://outlook.office.com
一个访问令牌只能绑定单一资源,混合请求不同资源的scope会直接触发invalid_scope错误,哪怕你已经完成了用户授权。
解决方案
分两次请求访问令牌,利用刷新令牌获取第二组scope的令牌:
第一次请求Graph令牌
用已获取的授权码,请求Graph相关的scope:offline_access profile openid email Contacts.Read Contacts.Read.Shared请求地址依然是
https://login.microsoftonline.com/common/oauth2/v2.0/token,成功后会得到:- 针对Graph的访问令牌(用于调用联系人API)
- 刷新令牌(后续用来请求Exchange协议的令牌)
第二次请求Exchange协议令牌
使用第一次得到的刷新令牌,请求Exchange相关的scope:https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send同样调用
https://login.microsoftonline.com/common/oauth2/v2.0/token接口,这次会得到针对IMAP/SMTP的访问令牌,用于邮件操作。
注意:授权码只能使用一次,所以必须用第一次请求得到的刷新令牌来获取第二组令牌,而不是重复使用授权码。
内容的提问来源于stack exchange,提问作者user7421317
相关产品推荐
相关产品推荐

