Невозможно получить код авторизации с Unity и OAuth2.0 - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю в приложении 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...
    }
}

1 Ответ

0 голосов
/ 20 февраля 2019

Ресурс отличается для токена и вызова API.В запросе токена ресурс https://graph.microsoft.com, это не ваш целевой API.Вы должны запросить токен для вашего целевого API.

...