【发布时间】:2016-11-28 09:11:05
【问题描述】:
我正在尝试使用 EWS-java-api 构建一个 android 应用程序,以使用适用于 android 的 Active Directory 身份验证库为 office365 用户获取带有 oAuth2 令牌的 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 门户中设置的配置。如果您能告诉如何设置 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: "surbhi.dhingra@<onmicrosoft domain>.com",
upn: "surbhi.dhingra@<onmicrosoft domain>.com",
ver: "1.0"
}.
错误日志:microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException:请求失败。请求失败。远程服务器返回错误:(401)Unauthorized 在 microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:74) W/System.err:在 microsoft.exchange.webservices.data.core.request.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:158) W/System.err:在 microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:504) 在 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)
【问题讨论】:
-
您能否分享一下您收到的具体错误消息,以及出现在您的访问令牌中的声明?您可以使用这样的网站从原始访问令牌中提取声明:calebb.net 我最初的猜测是访问 EWS 数据确实需要在您的客户端应用程序上进行一定数量的设置,而您似乎还没有完成。我上面要求的信息应该有助于澄清这一点。
-
@ShawnTabrizi:感谢您的帮助,这是我获取访问令牌的 JSON。并使用此访问令牌,我得到的错误是访问日历文件夹时出现 401 未经授权的访问。
标签: android office365 exchangewebservices azure-active-directory