Graph API аутентифицируется как пользователь программно

Я пытаюсь получить токен носителя 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. Вот версия С# для аутентификации:

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/common/oauth2/v2.0/ - 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