API на Graph се удостоверява като потребител програмно

Опитвам се да получа конкретен потребителски токен на носител OAuth2, използвайки HTTP POST заявка и изглежда нищо не работи.

login_url = 'https://login.microsoftonline.com/'
authorize_endpoint = '{0}{1}{2}'.format(login_url,config.tenant_id,'/oauth2/authorize')

bodyvals = {'client_id': config.client_id,
            'client_secret': config.client_secret,
            'grant_type': 'client_credentials',
            'resource':config.resource_endpoint}

return requests.post(authorize_endpoint, data=bodyvals)

Горният код работи, но генерира токен от името на приложението.
Изглежда не мога да намеря начин да предам идентификационните данни на потребителите и няма каквато и да е документация за това.

Като цяло не ме интересува дали отговорът е в Python или Powershell или просто общо обяснение, просто не изглежда да разбирам как правилно да направя това с AAD.


person 4c74356b41    schedule 14.12.2016    source източник


Отговори (2)


Можете да го направите ръчно, вижте другия ми отговор тук: https://stackoverflow.com/a/40844983/1658906.

Трябва да използвате grant_type=password и да извикате крайната точка oauth2/token. Ето версията на C# за удостоверяване:

private async Task<string> GetAccessToken()
{
    string tokenEndpointUri = Authority + "oauth2/token";

    var content = new FormUrlEncodedContent(new []
        {
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("username", Username),
            new KeyValuePair<string, string>("password", Password),
            new KeyValuePair<string, string>("client_id", ClientId),
            new KeyValuePair<string, string>("client_secret", ClientSecret),
            new KeyValuePair<string, string>("resource", PowerBiResourceUri)
        }
    );

    using (var client = new HttpClient())
    {
        HttpResponseMessage res = await client.PostAsync(tokenEndpointUri, content);

        string json = await res.Content.ReadAsStringAsync();

        AzureAdTokenResponse tokenRes = JsonConvert.DeserializeObject<AzureAdTokenResponse>(json);

        return tokenRes.AccessToken;
    }
}

В заявката трябва да посочите:

  1. Потребителско име
  2. Парола
  3. ID на клиента
  4. Тайна на клиента
  5. URI адресът на ресурса
person juunas    schedule 15.12.2016
comment
ресурс = graph.windows.net? - person 4c74356b41; 15.12.2016
comment
хм, изглежда е по-сложно от това, знаете ли как да получите код за отговор? подобно на това, което получавате, когато отидете на подобен URL адрес: login.microsoftonline.com/2oauth - person 4c74356b41; 15.12.2016
comment
Кодът за оторизация не се използва в този поток. Получавате токена за достъп директно. - person juunas; 15.12.2016
comment
да, това разбрах, но как да имитирам този поток с кода? добре, без емулиране на браузъра - person 4c74356b41; 15.12.2016
comment
Защо трябва да правите това? Не е ли много по-трудно със същия краен резултат? :) - person juunas; 15.12.2016
comment
добре, имам приложение, което прави това, и за функционални тестове трябва да удостоверя това приложение и то използва персонализиран пакет, така че предаването на токен просто няма да свърши работа, добре, поне не без да модифицирам пакета, което може да е правилният начин, ако не мога да разбера това - person 4c74356b41; 15.12.2016
comment
В този случай може да е по-лесно да се използва, напр. Selenium за автоматизиране на браузър. Мисля, че този поток не може да ви даде кода. - person juunas; 15.12.2016
comment
имате ли може би някои връзки, които биха могли да потвърдят тази идея, че това не може да се постигне с код? - person 4c74356b41; 15.12.2016
comment
Не разбирам вашата ситуация, просто реагирайки на харесване на браузър по програмен начин, получих добър резултат с CasperJS. - person Laurent Mazuel; 16.12.2016

За GraphAPI ресурсът е "https://graph.windows.net/"

Ако не искате да използвате ADAL, можете обаче да вземете поглед върху кода за използване на "ресурс". Този сценарий е покрит, така че считайте ADAL за голяма извадка :)

Освен това msrestazure има екземпляр на UserPassCredentials, който работи и на GraphAPI.

person Laurent Mazuel    schedule 14.12.2016
comment
adal е за удостоверяване на приложението, а не за удостоверяване на потребител? - person 4c74356b41; 14.12.2016
comment
ADAL е обща библиотека за удостоверяване. Можете да използвате код на устройство, потребител/пропуск, принципал на услугата и т.н. каквото AD предлага. Вижте уебсайта на ADAL за подробности. - person Laurent Mazuel; 16.12.2016