使用OAuth令牌验证和获取EWS数据

时间:2016-11-28 09:11:05

标签: android office365 exchangewebservices azure-active-directory

我正在尝试使用EWS-java-api构建一个Android应用程序,使用oAuth2令牌为office365用户使用活动目录身份验证lib for android获取EWS数据。类似于本文中针对.net所示的内容。 以下是代码:

// Code to acquire token after registering the native application in Azure active directory

authenticationContext.acquireToken(<activity context>, 
"<resource id: copied from the manifest file tag <resourceAppId> of Azure active directory after adding permission>", 
"<Application id of the registered app in AAD>", 
"<Application Redirect URI>", email, PromptBehavior.Always, "", AuthenticationCallback);

//We receive AuthenticationResult object containing authentication token in AuthenticationCallback onSuccess method and then call an async task to fetch EWS data

ExchangeService exchangeService = new ExchangeService();
exchangeService.setTraceEnabled(true);
exchangeService.getHttpHeaders().put("Authorization", "Bearer " + mAuthenticationResult.getAccessToken());
exchangeService.setUrl(URI.create("https://outlook.office365.com/EWS/Exchange.asmx"));

我能够获得oAuth令牌,但我无法接收交换数据,在使用以下代码获取数据时,它会给我未经授权和禁止访问。

CalendarFolder calendarFolder = CalendarFolder.bind(service, WellKnownFolderName.Calendar); 
findResults = calendarFolder.findAppointments(new CalendarView(startDate, endDate));

另外,我不确定我在azure portal中设置的配置。如果您可以告诉如何设置Azure AD应用程序以通过android中的oAuth身份验证获取EWS数据,那将会很棒。

编辑:

以下是我的访问令牌的声明:

这是我获取访问令牌的JSON。并且使用此访问令牌时,我得到的错误是访问日历文件夹时未经授权的访问。

JSON: {
typ: "JWT",
alg: "RS256",
x5t: "RrQqu9rydBVRWmcocuXUb20HGRM",
kid: "RrQqu9rydBVRWmcocuXUb20HGRM"
}.
{
aud: "6ae5db95-0af3-45b6-afce-17851abc9d55",
iss: "https://sts.windows.net/06d03691-efd5-43c5-8ec9-81e57c75f63c/",
iat: 1480554267,
nbf: 1480554267,
exp: 1480558167,
acr: "1",
amr: [
"pwd"
],
appid: "410db643-4efc-4dac-8e6f-bbf05da561e1",
appidacr: "0",
e_exp: 10800,
family_name: "Dhingra",
given_name: "Surbhi",
ipaddr: "112.110.19.113",
name: "Surbhi Dhingra",
oid: "52c73152-0add-4e68-8d60-54c03a35a4b9",
platf: "1",
scp: "user_impersonation",
sub: "hUaeKxiMI-m7nNNo2c5kMYd501Blw5QQ9SNPnP1Ei_c",
tid: "06d03691-efd5-43c5-8ec9-81e57c75f63c",
unique_name: "surbhi.dhingra@<onmicrosoft domain>.com",
upn: "surbhi.dhingra@<onmicrosoft domain>.com",
ver: "1.0"
}.

错误日志:microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException:请求失败。请求失败。远程服务器返回错误:(401)未经授权     at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:74) W / System.err:at microsoft.exchange.webservices.data.core.request.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:158) W / System.err:at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:504) at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:523) 在microsoft.exchange.webservices.data.core.service.folder.CalendarFolder.bind(CalendarFolder.java:60)     在microsoft.exchange.webservices.data.core.service.folder.CalendarFolder.bind(CalendarFolder.java:108)

2 个答案:

答案 0 :(得分:0)

似乎有一个回答的SO帖子EWS error message: "403: Forbidden - Not enough scopes"与您的问题类似。

  

只有Office 365 REST API支持细粒度访问,例如&#34;从所有邮箱中读取和写入电子邮件&#34;。对于EWS,您需要具有权限&#34;使用Exchange Web服务可以完全访问所有邮箱&#34;。如果您在查找此权限时遇到问题,请告诉我们。

因此,您需要在管理门户上的Azure AD中移至应用程序的CONFIGURE选项卡,然后将Office 365 Exchange Online权限添加到您的应用程序并启用Use Exchange Web Services with full access to all mailboxes,最后保存配置,请参阅下面的步骤和数据。

  1. 移至Azure AD中应用程序的CONFIGURE标签 enter image description here

  2. Office 365 Exchange Online权限添加到您的应用程序中 enter image description here

  3. 启用Use Exchange Web Services with full access to all mailboxes enter image description here

  4. 保存您的配置。

答案 1 :(得分:0)

感谢您提供访问令牌。 问题似乎是您已经为错误的受众(资源)获取了令牌。

如果你查看你的令牌,你会看到有一个“aud”声明,它定义了应该接受你的访问令牌的资源。

调用Exchange时,您应该拥有该资源的令牌:“https://outlook.office.com

您拥有的令牌似乎是针对特定的应用ID,可能是您在自己的租户中拥有的应用之一。

请查看我们公开的各种邮件API的参考信息: https://msdn.microsoft.com/en-us/office/office365/api/mail-rest-operations

在这里查看我们的样品: https://dev.office.com/code-samples#?filters=exchange,outlook

我希望这有帮助!