我尝试使用OAuth2访问Office365 REST API: http://msdn.microsoft.com/en-US/library/office/dn605901.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(读取联系人,日历和邮件)
答案 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"
}
因此,令牌似乎不会保留权限。