Контекст. В настоящее время я занимаюсь разработкой приложения Android с Android Studio 3.6.1, которое должно извлекать данные из Dynamics 365 для финансов и операций. Пользователь входит в систему, и я получаю токен доступа. После этого я пытаюсь запросить необходимые данные из D365. (См. Пример кода ниже). Данные находятся в хосте Dev VM в Azure.
Проблема: я уже пытался вызвать URL в браузере, который работал просто отлично. Но когда я звоню через приложение, я всегда получаю 401 не авторизованным.
Дополнительная информация: приложение зарегистрировано в Azure через портал и имеет разрешения API AX.FullAccess, CustomService.FullAccess и Odata .FullAccess (которые также предоставляются / утверждаются пользователем при первом входе в систему). ClientID / AppID также указан в форме / таблице Azure приложений в D365FO, назначенной администратору. Я также знаю, что тип токена - Bearer.
Знаете ли вы, что я что-то упускаю в моем запросе?
Метод, который выполняет запрос:
public String doInBackground(String... pToken)
{
try {
URL url = new URL("https://<myDevURL>.cloudax.dynamics.com/data/PersonUsers");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + pToken[0]);
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("OData-Version", "4.0");
conn.setRequestProperty("OData-MaxVersion", "4.0");
int httpResponseCode = conn.getResponseCode();
if(httpResponseCode == 200) {
StringBuilder response;
try(BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))){
String inputLine;
response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
}
return response.toString();
} else {
return String.format("Connection returned HTTP code: %s with message: %s",
httpResponseCode, conn.getResponseMessage());
}
}
catch (Exception e)
{
Log.d(TAG, e.getMessage());
return "";
}
}