"One or more scopes are not compatible with each other" 检索访问令牌时出错

"One or more scopes are not compatible with each other" error when retrieving access token for the

我有一个通过 Azure AD REST API v.2 与 Outlook、日历集成的应用程序。我尝试使用增量和动态范围来 "upgrade" 用户的令牌,以便该应用程序也可以访问 OneDrive,(因此用户可以直接将她的电子邮件附件上传到她的云中)。 授权代码检索重定向进行得很顺利,用户在登录后被要求提供额外的范围 (files.readwrite)。但是,在第 2 步尝试获取访问令牌时出现以下错误:

System.Exception: Acquire token by authorization code returned BadRequest: 

{
  "error": "invalid_scope",
  "error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. One or more scopes in 'https://outlook.office.com/mail.readwrite https://outlook.office.com/mail.send https://outlook.office.com/contacts.readwrite https://outlook.office.com/calendars.readwrite https://outlook.office.com/people.read files.readwrite' are not compatible with each other.\r\nTrace ID: b02fa0bf-6e86-4156-81e8-294dbc851500\r\nCorrelation ID: 3697bd18-554c-47e6-81cc-de3c47780fc9\r\nTimestamp: 2018-02-01 15:26:10Z",
  "error_codes": [
    70011
  ],
  "timestamp": "2018-02-01 15:26:10Z",
  "trace_id": "b02fa0bf-6e86-4156-81e8-294dbc851500",
  "correlation_id": "3697bd18-554c-47e6-81cc-de3c47780fc9"
}

或者这个错误:

System.Exception: Acquire token by authorization code returned BadRequest: 
{
  "error": "invalid_request",
  "error_description": "AADSTS700022: The provided value for the input parameter scope is not valid because it contains more than one resource. The scope https://outlook.office.com/mail.readwrite https://outlook.office.com/mail.send https://outlook.office.com/contacts.readwrite https://outlook.office.com/calendars.readwrite https://outlook.office.com/people.read files.readwrite is not valid.\r\nTrace ID: 9781d206-11b3-46c8-b972-8c4e77641c00\r\nCorrelation ID: 7e63af89-6e95-45f4-abaa-8f32051fb9ef\r\nTimestamp: 2018-02-01 15:36:32Z",
  "error_codes": [
    700022
  ],
  "timestamp": "2018-02-01 15:36:32Z",
  "trace_id": "9781d206-11b3-46c8-b972-8c4e77641c00",
  "correlation_id": "7e63af89-6e95-45f4-abaa-8f32051fb9ef"
}

我假设我不能对 Outlook 和 OneDrive 访问使用相同的令牌,因为它们 "different resources",一个是 Office 365 的一部分,另一个在 Microsoft 图表中,但是,我很难找到此处列出了哪些资源与哪些资源兼容 (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-scopes)。

我的问题是,这是否意味着我需要为 OneDrive 和 Outlook 维护 2 个不同的令牌(我的应用程序使用离线范围来刷新令牌)?

此外,个人帐户 OneDrive 和企业帐户 OneDrive(我认为与 Sharepoint 相同)之间有区别吗?在使用 Outlook 时,我可以对 outlook.com 和 Office365 电子邮件使用相同的代码,但我不确定在处理文件时是否如此。

使用 Google APIs 只需将 Google 驱动器(或任何其他 API)范围添加到您的 Gmail 访问范围即可,但我我猜 Microsoft APIs.

不是这种情况

谢谢

是的,您需要两个代币。正如 juunas 在他的评论中所说,问题出在观众身上,或者令牌中的 aud 参数。您要求适用于两个不同受众的范围:https://outlook.office.comhttps://graph.microsoft.com

好消息是这两个 API 确实有重叠的范围,Azure AD 将允许您使用为 Graph 颁发的刷新令牌来获取 Outlook API 的令牌。所以这就是我的建议(假设你正在做 authorization code flow

  1. 使用 Graph 范围进行授权请求:

    mail.readwrite 
    mail.send 
    contacts.readwrite 
    calendars.readwrite 
    people.read 
    files.readwrite
    
  2. 使用相同的 Graph 范围通过 grant_type=authorization_code 执行令牌请求。这将获取您的图形令牌 + 刷新令牌。

  3. 使用上一步中的刷新令牌对 grant_type=refresh_token 进行令牌请求,但这次仅使用符合 https://outlook.office.com 条件的 Outlook 适用范围。这将获取您的 Outlook 令牌。

    https://outlook.office.com/mail.readwrite 
    https://outlook.office.com/mail.send 
    https://outlook.office.com/contacts.readwrite 
    https://outlook.office.com/calendars.readwrite 
    https://outlook.office.com/people.read