Office365 EWS API:令牌具有无效值“角色”,用于声明类型''

时间:2014-08-07 14:30:49

标签: office365 office365-apps

我尝试使用OAuth2访问Office365 REST API: http://msdn.microsoft.com/en-US/library/office/dn605901.aspx

我按照这里描述的所有步骤: http://blogs.msdn.com/b/exchangedev/archive/2014/03/25/using-oauth2-to-access-calendar-contact-and-mail-api-in-exchange-online-in-office-365.aspx

我有一个OAuth2令牌用于资源" https://outlook.office365.com/"但是当我尝试访问API时,我收到以下错误:

"The token has invalid value 'roles' for the claim type ''."

我成功设法访问Windows Azure AD" Graph" API使用相同的逻辑,我没有看到任何与'&34;声称"在文档的任何地方。 我错过了什么吗?

到目前为止,我已经尝试在授权uri中添加或删除prompt = admin_consent,这会触发来自microsoft的正确对话,但这并没有改变任何内容。

我向以下终端发送请求:

https://outlook.office365.com/EWS/OData/Me/Inbox/Messages

这是原始回应:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Server: Microsoft-IIS/8.0
request-id: b5b3df59-c23d-4a47-83b7-79c2f7ed6211
Set-Cookie: ClientId=OGLQDFMY0KPSRZSMJBA; expires=Fri, 07-Aug-2015 14:00:33 GMT; path=/; HttpOnly
X-CalculatedBETarget: dm2pr0701mb1216.namprd07.prod.outlook.com
x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
X-DiagInfo: DM2PR0701MB1216
X-BEServer: DM2PR0701MB1216
X-AspNet-Version: 4.0.30319
Set-Cookie: exchangecookie=17695b411d96429b9a2e2db37905b856; expires=Fri, 07-Aug-2015 14:00:35 GMT; path=/; HttpOnly
Set-Cookie: X-BackEndCookie=OrganizationAnchor@cleverage.onmicrosoft.com=u56Lnp2ejJqBnZqdm8zIm8bSzMnNyNLLz52a0sfGx8zSy8nHm53Myc+anMqcgZyTmomajZ6YmtGQkZKWnI2QjJCZi9GckJKBzc/Oy9LPxtLPyavOy8XPz8XMyg==; expires=Sat, 06-Sep-2014 14:00:35 GMT; path=/EWS; secure; HttpOnly
X-Powered-By: ASP.NET
X-FEServer: AMSPR02CA0019
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: Thu, 07 Aug 2014 14:00:34 GMT
Connection: close
Content-Length: 0

仅为了您的信息,我正在使用" lusitanian / oauth"开发Symfony2应用程序。 OAuth库,只需一些调整即可连接到Azure AD。

我将非常感谢能提供的任何帮助:)

[编辑]

顺便说一句,API可以与Basic HTTP Auth一起使用,但它会强制我在我的数据库中以明文形式存储所有用户的密码,这非常可怕。

Azure后端中Office 365 Exchange Online的委派权限设置为3(读取联系人,日历和邮件)

2 个答案:

答案 0 :(得分:0)

在Azure AD中注册应用程序时,是否为Office 365 Exchange Online添加了权限?您是否设置了应用程序权限或委派权限? (UI不应该提供任何可用的应用程序权限,因为它们尚未得到支持,但只是为了确保......)。原因是应用程序权限通常显示为'角色'在令牌中,委派的权限显示为' scp'在令牌中。

此外,您可以解码您的访问令牌并与此示例进行比较吗?您可以使用http://jwt.calebb.net/从您获得的base64编码令牌中快速解析。如果您遇到问题,可以在此处发布,但请首先删除客户ID,租户ID和用户信息!我只是想看看结构,以及你的aud和scp值(如果有的话)。它应该看起来像:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}

{
  "aud": "https://outlook.office365.com/",
  "iss": "https://sts.windows.net/<tenant_id>/",
  "iat": 1407344872,
  "nbf": 1407344872,
  "exp": 1407348772,
  "ver": "1.0",
  "tid": "<your tenant_id>",
  "amr": [
    "pwd"
  ],
  "oid": "169bf758-9811-4f6a-b924-80c6bbd4ad92",
  "upn": <user_email>,
  "unique_name": <user_email>,
  "sub": "2n3Mq5HtdCN1WVQk494lPipvfVxeSZCYATOpWyN92iA",
  "puid": "10037FF56F8936F7",
  "family_name": "Chaves",
  "given_name": "Mack",
  "appid": "<your client_id>",
  "appidacr": "0",
  "scp": "Contacts.Write Calendars.Write Mail.Send Mail.Write",
  "acr": "1"
}

如果它看起来不同,那么您的应用注册就会出现问题。确保您按照http://msdn.microsoft.com/EN-US/library/office/dn605894(v=office.15).aspx中的步骤操作,特别是&#34;在Azure AD&#34;中手动注册您的Web应用程序,&#34;获取应用程序密钥&#34;以及&#34;配置API权限&#34;部分(在您的情况下使用Exchange而不是SharePoint)。

修改

登录https://manage.windowsazure.com并导航至您的应用。选择应用程序后,单击底部的Manage Manifest(管理清单)按钮,然后选择下载清单。用文本编辑器打开它。发布名为&#34; requiredAppPermissions&#34;而且我会检查它。

答案 1 :(得分:0)

非常感谢您的回答,Exchange和Sharepoint的权限都设置为在Azure后端列出和读取,因此它应该没问题...

我解码了令牌并得到了:

{
 "typ": "JWT",
 "alg": "RS256",
 "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}.
{
 "aud": "https://outlook.office365.com/",
 "iss": "https://sts.windows.net/<tenant>/",
 "iat": 1407766971,
 "nbf": 1407766971,
 "exp": 1407770871,
 "ver": "1.0",
 "tid": "<tenant>",
 "oid": "996481f3-9769-4e02-ab1c-8c4c006da659",
 "sub": "996481f3-9769-4e02-ab1c-8c4c006da659",
 "idp": "https://sts.windows.net/<tenant>/",
 "appid": "<client>",
 "appidacr": "1"
}

它看起来并不像我们的期望。

我有一些想要测试的想法,我会发布结果。

[编辑]

我使用Graph API获得的令牌看起来一样,而且工作正常:

{
    "aud": "https://graph.windows.net/",
    "iss": "https://sts.windows.net/<tenant>/",
    "iat": 1407767341,
    "nbf": 1407767341,
    "exp": 1407771241,
    "ver": "1.0",
    "tid": "<tenant>",
    "oid": "996481f3-9769-4e02-ab1c-8c4c006da659",
    "sub": "996481f3-9769-4e02-ab1c-8c4c006da659",
    "idp": "https://sts.windows.net/<tenant>/",
    "appid": "<client>",
    "appidacr": "1"
}

因此,令牌似乎不会保留权限。