我正在尝试使用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)
答案 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 :(得分: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
我希望这有帮助!