我正在开发一个我想要多租户的Office 365应用程序:也就是说,我希望应用程序能够访问来自其他组织的用户访问交换数据。到目前为止,我已经能够代表所需的第三方用户创建OAuth 2访问令牌,但是没有向用户显示同意屏幕,并且API请求失败,包含以下标题的401 Unauthorized错误:
< x-ms-diagnostics: 2000001;reason="No applicable user context claims found.";error_category="invalid_token"
更详细地说,我做了以下工作。我已经创建并配置了Azure AD应用程序。我已将应用程序配置为多租户,并为AAD访问以及交换和共享点访问添加了委派权限。使用此应用程序的端点,我代表第三方用户发出OAuth 2授权请求。此请求成功而不显示任何同意屏幕,返回访问代码[1]。后续访问令牌请求也会成功[2]。访问令牌请求中请求的资源是https://outlook.office365.com,成功的访问令牌响应包含Mail.Read范围。此时,邮件API请求(例如,为用户列出消息)代表第三方用户失败[3]。
设置可供其他组织中的用户使用的正确多租户应用程序需要什么?
[1]
第三方身份验证代码请求:
https://login.windows.net/<uid>/oauth2/authorize?api-version=1.0&client_id=<client id>&response_type=code&resource=https://outlook.office365.com/
重定向是:
http://localhost:3000/?code=<access code>&session_state=e9ba65e1-860e-41ab-b3d4-7af64d54135e
localhost:3000是我为应用程序配置的回复URL
[2]访问令牌请求:
curl -X POST https://login.windows.net/<uid>/oauth2/token \
-F redirect_uri=http://localhost:3000 \
-F grant_type=authorization_code \
-F resource=https://outlook.office365.com \
-F client_id=<id> \
-F client_secret=<secret> \
-F code=<auth code above>
响应:
200 OK
{
"access_token": "<token>",
"expires_in": "3599",
"expires_on": "1421092817",
... "resource": "https://outlook.office365.com",
"scope": "Calendars.Read Calendars.Write Contacts.Read Contacts.Write full_access_as_user Mail.Read Mail.Send Mail.Write",
"token_type": "Bearer"
}
[3] API请求:
curl -v https://outlook.office365.com/api/v1.0/me \
-H "Authorization: Bearer <access token>"
响应:
< HTTP/1.1 401 Unauthorized
* Server Microsoft-IIS/8.0 is not blacklisted
< Server: Microsoft-IIS/8.0
< request-id: 4b30a79a-ee3d-4bac-856c-2b1cce9c4043
< Set-Cookie: ClientId=ZILVUOFNNUSPO455YJRBCW; expires=Tue, 12-Jan-2016 18:27:47 GMT; path=/; secure; HttpOnly
< x-ms-diagnostics: 2000001;reason="No applicable user context claims found.";error_category="invalid_token"
< X-Powered-By: ASP.NET
< X-FEServer: BN3PR0301CA0033
< 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=""
< Date: Mon, 12 Jan 2015 18:27:49 GMT
< Content-Length: 0
<
答案 0 :(得分:1)
请从您的授权请求中删除api-version = 1.0参数。看起来应该是这样的: