получить доступ к Microsoft Graph без пользователя - отсутствует «grant_type» в теле - PullRequest
1 голос
/ 22 декабря 2019

Я хочу попасть в Microsoft Azure и Graph и создал простое приложение, которое должно использовать Graph API в качестве фонового работника. У меня пока есть только демо-счет, но я думаю, что это не имеет значения .

Я следую этому уроку

https://docs.microsoft.com/en-us/graph/auth-v2-service#4-get-an-access-token

потому что мне не нужна учетная запись пользователя для этого. Сначала я хочу получить токен доступа, используя Axios . Я использую NestJ, чтобы Axios был упакован в HTTP-модуль .

Так что я до сих пор делал настройку запроса

async getToken(): Promise<any> {
    const requestURL: string = 'https://login.microsoftonline.com/2c1714e1-1030-4da9-af5e-59630d7fe05f/oauth2/v2.0/token';

    const requestBody: object = {
        tenant: '2c1714e1-1030-4da9-af5e-59630d7fe05f',
        client_id: 'bec52b71-dc94-4577-9f8d-b8536ed0e73d',
        scope: 'https://graph.microsoft.com/.default',
        client_secret: 'OV/NkBIWH7d3G/BGyJQN3vxQA]fT6qK@',
        grant_type: 'client_credentials',
    };

    const requestConfiguration: object = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    };

    const observableResult: Observable<AxiosResponse<any>> = this.httpService.post(requestURL, requestBody, requestConfiguration);
    return observableResult.toPromise();
}

Я получаю 400 Ошибка HTTP со следующим сообщением:

"AADSTS900144: Тело запроса должно содержать следующий параметр: 'grant_type'. \ R \ nTrace ID: 038a3bf5-9396-4a4c-9dd6-b4608f265800 \ r \ nКорреляционный идентификатор: a1871bfc-af0d-470e-b604-f94ea4f10325 \ r \ nTimestamp: 2019-12-21 23: 10: 11Z "

Не понял ли я документы? Что не так или нет? Заранее спасибо

1 Ответ

1 голос
/ 22 декабря 2019

Ваши данные совершенно верны (почтальон получает токен с вашими данными). Но кажется, что вы допустили ошибку при отправке запроса POST.

Как говорит doc , упомянутый вами, Content-Type: application/x-www-form-urlencoded. Поэтому сначала нужно преобразовать requestBody в закодированную форму URL (key=value&key2=value2), и не добавлять ее в URL, а передавать как тело. Это не очевидная часть ...

const requestURL: string = 'https://login.microsoftonline.com/2c1714e1-1030-4da9-af5e-59630d7fe05f/oauth2/v2.0/token';

const requestBody: object = {
    tenant: '2c1714e1-1030-4da9-af5e-59630d7fe05f',
    client_id: 'bec52b71-dc94-4577-9f8d-b8536ed0e73d',
    scope: 'https://graph.microsoft.com/.default',
    client_secret: 'OV/NkBIWH7d3G/BGyJQN3vxQA]fT6qK@',
    grant_type: 'client_credentials',
};

let request = Object.keys(requestBody).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(requestBody[k])}`).join('&')
this.httpService.post(requestURL, request, { headers: { 'content-type': 'application/x-www-form-urlencoded' } })
...