2

我正尝试使用EWS-java-api为使用android的活动目录身份验证库的office365用户使用oAuth2令牌获取EWS数据。类似于本文中为.net所显示的内容。 下面是代码:使用OAuth令牌验证和获取EWS数据

// 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门户中设置的配置。如果您可以告诉如何设置Azure AD应用程序以通过android中的oAuth身份验证获取EWS数据,那将非常好。

编辑:

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

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

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: "[email protected]<onmicrosoft domain>.com", 
upn: "[email protected]<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:microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:504) at microsoft.exchange.webservices .data.core.ExchangeService.bindToFolder(ExchangeService.java:523) at microsoft.exchange.webservices.data.core.service.folder.CalendarFolder.bind(CalendarFolder.java:60) at microsoft.exchange.webservices.data .core.service.folder.CalendarFolder.bind(CalendarFolder.java:108)

+0

能否请您分享您收到的特定错误消息以及出现在您的访问令牌中的声明?您可以使用这样的网站从您的原始访问令牌中提取声明:http://calebb.net/ 我最初的猜测是,访问EWS数据确实需要在您的客户端应用程序上进行一定程度的设置你还没有完成。我上面要求的信息应该有助于澄清这一点。 –

+0

@ShawnTabrizi:感谢您的帮助,这是我获取访问令牌的JSON。并使用此访问令牌我得到的错误是401访问日历文件夹时未经授权的访问。 – Surbhi

回答

0

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

Only Office 365 REST APIs support granular access such as "Read and write email from all mailboxes". For EWS, you need the permission "Use Exchange Web Services with full access to all mailboxes". Let us know if you have trouble finding this permission.

所以,你需要移动到在管理门户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

我用错误日志编辑了我的答案,请通过它们。我无法访问Azure经典门户,但我正在使用新门户添加权限。我在哪里生成2个应用程序一个本机和一个web api,在web api应用程序中,我在网上添加了office 365 exchange,完全访问权限已启用,如答案中所示。这个web api应用程序我添加了我的本机应用程序权限,并使用由此生成的相同资源ID。不过,我收到未经授权的错误。此外,我在Web API应用程序中生成一个秘密密钥,我在使用SecretKeyFactory的代码中使用它。 – Surbhi

0

感谢您提供您的访问令牌。 这个问题似乎是,你已经获得了错误观众(资源)的标记。

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

当调用兑换,你应该有一个资源的令牌:“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

我希望这有助于!

相关问题