Azure Office 365 API,错误:令牌具有声明类型“”的无效值“角色”

Azure Office 365 API,错误:令牌具有声明类型“”的无效值“角色”,azure,oauth,ms-office,exchangewebservices,office365,Azure,Oauth,Ms Office,Exchangewebservices,Office365,我正在尝试访问office 365 API,特别是Exchange API 我正在尝试开发一个服务器/守护程序应用程序来轮询共享收件箱,因此我正在使用OAuth 2.0中的“client_credentials”授权类型。我已按照步骤在Azure Active Directory中生成应用程序,您可以从屏幕上看到该应用程序拥有的权限: 最后,我想开发一个Ruby应用程序来提取数据,但首先我要用cURL测试响应,下面是OAuth令牌Requirest: curl -X POST https://l

我正在尝试访问office 365 API,特别是Exchange API

我正在尝试开发一个服务器/守护程序应用程序来轮询共享收件箱,因此我正在使用OAuth 2.0中的“client_credentials”授权类型。我已按照步骤在Azure Active Directory中生成应用程序,您可以从屏幕上看到该应用程序拥有的权限:

最后,我想开发一个Ruby应用程序来提取数据,但首先我要用cURL测试响应,下面是OAuth令牌Requirest:

curl -X POST https://login.windows.net/TENANT_KEY/oauth2/token \
  -F redirect_uri=http://spreadyDaemon \
  -F grant_type=client_credentials \
  -F resource=https://outlook.office365.com/ \
  -F client_id=XXXX \
  -F client_secret=XXXX=
这将返回一个JWT密钥,解码时如下所示:

标题

主张

但是,当我随后使用该令牌从Exchange API请求任何内容时,我得到一个401 Unauthorized,x-ms-diagnostics标头设置为:

x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
以下是完整的标题:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Server: Microsoft-IIS/8.0
request-id: d08d01a8-7213-4a13-a598-08362b4dfa70
Set-Cookie: ClientId=WDALDNO0CAIOOZDZWTA; expires=Sat, 14-Nov-2015 16:40:59 GMT; path=/; HttpOnly
X-CalculatedBETarget: am3pr01mb0662.eurprd01.prod.exchangelabs.com
x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
X-DiagInfo: AM3PR01MB0662
X-BEServer: AM3PR01MB0662
X-AspNet-Version: 4.0.30319
Set-Cookie: exchangecookie=6bf68da033684824af21af3b0cdea6e3; expires=Sat, 14-Nov-2015 16:40:59 GMT; path=/; HttpOnly
Set-Cookie: X-BackEndCookie2=OrganizationAnchor@Fitzdares.onmicrosoft.com=u56Lnp2ejJqBz82am8zJx8zSzcmey9LLyZrI0p6cmp3SycjLm8eazcjIy83IgbmWi4Wbno2ajNGQkZKWnI2QjJCZi9GckJKBzc/Oy9LOzdLOy6vOycXLz8XKxoGaio2PjZvPztGPjZCb0ZqHnJeekZiak56djNGckJI=; expires=Sun, 14-Dec-2014 16:40:59 GMT; path=/EWS; secure; HttpOnly
Set-Cookie: X-BackEndCookie=OrganizationAnchor@Fitzdares.onmicrosoft.com=u56Lnp2ejJqBz82am8zJx8zSzcmey9LLyZrI0p6cmp3SycjLm8eazcjIy83IgbmWi4Wbno2ajNGQkZKWnI2QjJCZi9GckJKBzc/Oy9LOzdLOy6vOycXLz8XKxg==; expires=Sun, 14-Dec-2014 16:40:59 GMT; path=/EWS; secure; HttpOnly
X-Powered-By: ASP.NET
X-FEServer: DB4PR02CA0026
WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", authorization_uri="https://login.windows.net/common/oauth2/authorize", error="invalid_token",Basic Realm="",Basic Realm=""
Date: Fri, 14 Nov 2014 16:40:59 GMT
Content-Length: 0
我不确定我是否误解了一些文档或遗漏了某个步骤。但是JWT缺少任何可访问的作用域。我不确定如何向应用程序清单添加特定权限,如下所述:

以下是我的清单的显示方式:


任何帮助都将不胜感激

感谢您提供的详细信息!您的问题可能与中讨论的问题相同,取消选中“拥有对用户邮箱的完全访问权限”可能会修复您看到的问题

如果您有任何问题,或者在取消选中此权限后仍被拒绝访问,请告诉我

[更新]:Jason是对的-我们还不支持客户端凭据流。然而,我们很快就可以做到这一点。因此,请在几周后继续关注一个博客,并宣布它可用,以及使用说明

[更新]:现在提供对服务帐户的支持。有关更多详细信息,请参阅我们的。

Venkat

我怀疑问题在于你如何申请代币。您使用的是grant\u type=client\u凭据,Exchange Online不支持该凭据,至少目前不支持。Exchange支持的唯一授权类型是授权代码。见Matthias于11月4日对此帖子的评论:

这也可能有帮助:

更新:现在支持客户端凭据流


Jason

Hi Venkat,感谢您的快速响应,不幸的是,这并没有解决问题。看来我的问题是JWT索赔回复中缺少角色。你好,尼克,谢谢你的更新。让我和我的团队核实一下你的请求失败的原因。谢谢。你好,尼克,服务帐户支持现在可用。更多信息,请查看我的更新答案。谢谢,谢谢你的回答,杰森。仅引用Mathia对其他任何与我有类似问题的人的client_凭证问题的回应,在代码流中没有办法避免用户名/密码。我们正在为今秋晚些时候开发一个客户端凭据流,它将为您提供运行后台服务所需的功能。为此,您不需要用户名/密码,但应用程序将直接声明其身份并作为自身进行身份验证。。不幸的是,当我试图编写一个无头守护进程时,我需要等待这个特性。嗨,尼克,我刚刚更新了我的答案。我们非常接近于支持客户端凭据流,因此请继续关注几周后的公告。感谢您使用Office 365 REST API.Venkat,客户端凭据流的任何更新。如果不是,我应该在哪里寻找公告?Nick,你可以在Twitter@JasonJohMSFT上关注我,或者在上观看Exchange开发博客。当我们开始使用它时,我肯定会发布。
x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
HTTP/1.1 401 Unauthorized
Cache-Control: private
Server: Microsoft-IIS/8.0
request-id: d08d01a8-7213-4a13-a598-08362b4dfa70
Set-Cookie: ClientId=WDALDNO0CAIOOZDZWTA; expires=Sat, 14-Nov-2015 16:40:59 GMT; path=/; HttpOnly
X-CalculatedBETarget: am3pr01mb0662.eurprd01.prod.exchangelabs.com
x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
X-DiagInfo: AM3PR01MB0662
X-BEServer: AM3PR01MB0662
X-AspNet-Version: 4.0.30319
Set-Cookie: exchangecookie=6bf68da033684824af21af3b0cdea6e3; expires=Sat, 14-Nov-2015 16:40:59 GMT; path=/; HttpOnly
Set-Cookie: X-BackEndCookie2=OrganizationAnchor@Fitzdares.onmicrosoft.com=u56Lnp2ejJqBz82am8zJx8zSzcmey9LLyZrI0p6cmp3SycjLm8eazcjIy83IgbmWi4Wbno2ajNGQkZKWnI2QjJCZi9GckJKBzc/Oy9LOzdLOy6vOycXLz8XKxoGaio2PjZvPztGPjZCb0ZqHnJeekZiak56djNGckJI=; expires=Sun, 14-Dec-2014 16:40:59 GMT; path=/EWS; secure; HttpOnly
Set-Cookie: X-BackEndCookie=OrganizationAnchor@Fitzdares.onmicrosoft.com=u56Lnp2ejJqBz82am8zJx8zSzcmey9LLyZrI0p6cmp3SycjLm8eazcjIy83IgbmWi4Wbno2ajNGQkZKWnI2QjJCZi9GckJKBzc/Oy9LOzdLOy6vOycXLz8XKxg==; expires=Sun, 14-Dec-2014 16:40:59 GMT; path=/EWS; secure; HttpOnly
X-Powered-By: ASP.NET
X-FEServer: DB4PR02CA0026
WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", authorization_uri="https://login.windows.net/common/oauth2/authorize", error="invalid_token",Basic Realm="",Basic Realm=""
Date: Fri, 14 Nov 2014 16:40:59 GMT
Content-Length: 0
{
  "allowActAsForAllClients": null,
  "appId": "XXXX",
  "appMetadata": {
    "version": 0,
    "data": []
  },
  "appRoles": [],
  "availableToOtherTenants": false,
  "displayName": "Fitzdares",
  "errorUrl": null,
  "groupMembershipClaims": null,
  "homepage": "http://spreadyDaemon",
  "identifierUris": [
    "http://spreadyDaemon"
  ],
  "keyCredentials": [],
  "knownClientApplications": [],
  "logoutUrl": null,
  "oauth2AllowImplicitFlow": false,
  "oauth2AllowUrlPathMatching": false,
  "oauth2Permissions": [],
  "oauth2RequirePostResponse": false,
  "passwordCredentials": [
    {
      "customKeyIdentifier": null,
      "endDate": "2016-11-14T16:30:45.0745603Z",
      "keyId": "46cce171-ed65-4828-8af7-d02af950e44a",
      "startDate": "2014-11-14T16:30:45.0745603Z",
      "value": null
    }
  ],
  "publicClient": null,
  "replyUrls": [
    "http://spreadyDaemon"
  ],
  "requiredResourceAccess": [
    {
      "resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
      "resourceAccess": [
        {
          "id": "3b5f3d61-589b-4a3c-a359-5dd4b5ee5bd5",
          "type": "Scope"
        },
        {
          "id": "185758ba-798d-4b72-9e54-429a413a2510",
          "type": "Scope"
        },
        {
          "id": "75767999-c7a8-481e-a6b4-19458e0b30a5",
          "type": "Scope"
        },
        {
          "id": "5eb43c10-865a-4259-960a-83946678f8dd",
          "type": "Scope"
        }
      ]
    },
    {
      "resourceAppId": "00000002-0000-0000-c000-000000000000",
      "resourceAccess": [
        {
          "id": "5778995a-e1bf-45b8-affa-663a9f3f4d04",
          "type": "Scope"
        },
        {
          "id": "78c8a3c8-a07e-4b9e-af1b-b5ccab50a175",
          "type": "Scope"
        },
        {
          "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6",
          "type": "Scope"
        }
      ]
    }
  ],
  "samlMetadataUrl": null,
  "defaultPolicy": [],
  "extensionProperties": [],
  "objectType": "Application",
  "objectId": "8af97a9f-74c7-499d-b29a-7fca6926d84e",
  "deletionTimestamp": null,
  "createdOnBehalfOf": null,
  "createdObjects": [],
  "manager": null,
  "directReports": [],
  "members": [],
  "memberOf": [],
  "owners": [],
  "ownedObjects": []
}