Начать с. Я новичок в платформе Azure. Пока я пытаюсь понять, как решить эту проблему.
private class TokenRequestTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("client_id", "{CLIENT_ID}")
.add("client_secret", "{CLIENT_SECRET}")
.add("scope", "https://api.businesscentral.dynamics.com/v2.0/.default")
.add("grant_type", "client_credentials")
.build();
Request request = new Request.Builder()
.url("https://login.windows.net/{TENANT_ID}/oauth2/v2.0/token")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseBody = response.body().string();
String responseHeader = response.headers().toString();
JSONObject jsonObject = new JSONObject(responseBody);
String accessToken = jsonObject.getString("access_token");
SharedPreferences._instance.setToken(accessToken);
return accessToken;
} else {
return "Request failed: " + response.code();
}
} catch (Exception e) {
e.printStackTrace();
return "Request failed: " + e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
// Handle the token or error response
System.out.println(result);
}
}
Этот код предназначен для тестирования и будет изменен в будущем, как только мы заставим все работать.
Эта задача запроса токена может получить токен. Но проблема в том, что мы пытаемся вызвать наш собственный API. Мы получаем 401, и ответ сообщает нам, что учетные данные недействительны.
URL-адрес выглядит примерно так
Созданное нами приложение, соответствующее CLIENT_ID и CLIENT_SECRET, имеет
Несмотря на все эти разрешения, он все равно получает ошибку 401. Что может быть не так? Есть ли способ узнать, какое разрешение необходимо? Или что нам нужно сделать
Декодированный токен
{
"typ": "JWT",
"alg": "RS256",
"x5t": "L1KfKFI_jnXbwWc22xZxw1sUHH0",
"kid": "L1KfKFI_jnXbwWc22xZxw1sUHH0"
}.{
"aud": "https://api.businesscentral.dynamics.com",
"iss": "https://sts.windows.net/{TENANT_ID}",
...
"roles": [
"Automation.ReadWrite.All",
"app_access",
"AdminCenter.ReadWrite.All",
"API.ReadWrite.All"
],
...
"ver": "1.0"
}.[Signature]
Создайте роли приложения, предоставьте разрешения API для этих ролей приложения и сгенерируйте токен доступа.
Это мой собственный API
Вы создавали роли приложений? и декодируйте токен доступа в jwt.ms и проверьте, содержит ли утверждение роли необходимые разрешения.
Добавлены части декодированного токена.
Можете ли вы также прикрепить скриншот Expose a API?
Не думаю, что мы что-то добавили в «Раскрыть API» (теперь мне трудно проверить, поскольку клиент не позволяет мне войти в систему самостоятельно, не поделившись экраном и не сообщив им, куда нажимать). Может ли быть там, что нам следует выставить собственный API?
Давайте продолжим обсуждение в чате.


Ошибка обычно возникает, если вы не добавляете приложение Microsoft Entra ID на портал Dynamics 365 Business Central и не предоставляете разрешения на портале D365.
Я создал приложение Microsoft Entra ID и предоставил разрешения API:

Теперь войдите на Портал Dynamics 365 Business Central -> Нажмите значок поиска -> Поиск приложений Microsoft Entra -> Создать.


Вставьте идентификатор клиента приложения Microsoft Entra и установите состояние «Включено» -> нажмите «ДА».


Во вкладке «Разрешения» дайте полный доступ:

Теперь войдите на Портал Dynamics 365 Business Central -> Настройки -> Центр администрирования.

И скопируйте TenantID и имя среды:

Я сгенерировал токен доступа, используя следующие параметры:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
client_secret:ClientSecret
grant_type:client_credentials
scope:https://api.businesscentral.dynamics.com/.default

Я могу успешно получить компании, как показано ниже:
GET https://api.businesscentral.dynamics.com/v2.0/TenantID/EnvironmentName/api/v2.0/companies

Вы хотите вызвать API Dynamics 365 Business Central или свой собственный API?