Я работаю в приложении Unity, которому необходимо подключиться к Microsoft Dynamics 365, которая использует OAuth2.0.Я пытался использовать UnityWebRequest для получения токена доступа, вызвав:
https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/token
, используя что-то похожее на эту тему:
Аутентификация OAuth2 и операции в Unity
И это работает, я могу получить и access_token, однако, когда я пытаюсь использовать службу с токеном на предъявителя, я всегда получаю «401 не авторизован».
Затем я попытался позвонить вместо:
https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/authorize
Но когда я это сделаю, ответом будет фактический HTML-код экрана входа Microsoft.Насколько я знаю, получение кода авторизации требует взаимодействия с пользователем, верно?но я смог добиться этого, используя пакет Microsoft.IdentityModel.Clients.ActiveDirectory из NuGet в консольном приложении C # без взаимодействия с пользователем, поэтому должен быть способ, верно?
Буду очень признателенпомощь в этом!спасибо!
ОБНОВЛЕНИЕ 1 - Мой код
Получить токен доступа
private IEnumerator GetAccessToken(Action<string> result)
{
Dictionary<string, string> content = new Dictionary<string, string>();
//Fill key and value
content.Add("scope", "https://graph.microsoft.com/.default");
content.Add("grant_type", "client_credentials");
content.Add("client_id", "xxxxx");
content.Add("client_secret", "xxxx");
UnityWebRequest www = UnityWebRequest.Post("https://login.microsoftonline.com/[TENANTID]/oauth2/v2.0/token", content);
//Send request
yield return www.Send();
if (!www.isError)
{
string resultContent = www.downloadHandler.text;
TokenClassName json = JsonUtility.FromJson<TokenClassName>(resultContent);
//Return result
result(json.access_token);
}
else
{
//Return null
result("");
}
}
Вызов API
private IEnumerator GetData(Action<string> result)
{
Dictionary<string, string> content = new Dictionary<string, string>();
//Fill key and value
content.Add("CustomerGroupId", "10");
UnityWebRequest www = UnityWebRequest.Post("https://[ENVIRONMENT].cloudax.dynamics.com/data/TestEntity", content);
string token = null;
yield return GetAccessToken((tokenResult) => { token = tokenResult; });
result(token);
www.SetRequestHeader("Authorization", "Bearer " + token);
www.Send();
if (!www.isError)
{
string resultContent = www.downloadHandler.text;
// Perform additional operations...
}
}