Не удается правильно отправить тело запроса для node.js версии XMLHttpRequest при выполнении запроса POST - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь сделать запрос PSOT на URL-адрес токена Microsoft Oauth2.0, используя NodeJS, а библиотека XMLHttpRequest обнаружила здесь . Однако у меня проблема в том, что я просто не могу отправить надлежащее тело запроса вместе с запросом. Я уже пытался использовать FormData из здесь , я пытался URLSearchParams, и я пытался сделать его строкой так, как мы знаем из нашей панели адресов в GET-запросах. Ниже вы можете увидеть мой код с того момента, когда я пытался сделать это в форме GET URL, и в части, в которой я дал оценку, вы можете увидеть мои попытки использовать FormData вместо этого.

var xhr = new XMLHttpRequest();
        xhr.open("POST", 'https://login.microsoftonline.com/common/oauth2/v2.0/token');

        /*var data = new FormData();
        //var data = new URLSearchParams();
        data.append('client_id', clientId);
        data.append("grant_type", "authorization_code");
        data.append("scope", "openid email profile");
        data.append("code", code);
        data.append("redirect_uri", "http://" + req.headers.host + req.url);
        data.append("client_secret", secret);
        Error message on this one: TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of FormData
Same message with URLSearchParams, except it received an instance of URLSearchParams
*/

        var data = 'client_id=' + clientId;
        data += '&grant_type=authorization_code';
        data += '&scope=openid%20email%20profile';
        data += '&code=' + code;
        data += '&redirect_uri=' + encodeURIComponent("http://" + req.headers.host + req.url);
        data += '&client_secret=' + secret;
        //This one gives me an error message from Microsoft: {"error":"invalid_request","error_description":"AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: ratherNotSay\r\nCorrelation ID: ratherNotSay\r\nTimestamp: 2020-02-10 10:37:36Z","error_codes":[900144],"timestamp":"2020-02-10 10:37:36Z","trace_id":"ratherNotSay","correlation_id":"ratherNotSay","error_uri":"https://login.microsoftonline.com/error?code=900144"}
//This must mean that the request body can not have been submitted in the right way.

        xhr.onreadystatechange = () => {
          if (xhr.readyState == 4) {
            console.log(xhr.status + "\n" + xhr.responseText + "\n");
          }
        };
        xhr.send(data);

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете преобразовать экземпляр URLSearchParams в строку запроса, например, созданную вручную, с помощью метода toString().

Я не знаю, заголовок Content-Type по умолчанию установлен в application/x-www-form-urlencoded в версии node-XMLHTTPRequest, но установка вручную не помешает.

const xhr = new XMLHttpRequest();
xhr.open("POST", 'https://login.microsoftonline.com/common/oauth2/v2.0/token');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

const data = new URLSearchParams();
data.append('client_id', clientId);
data.append("grant_type", "authorization_code");
data.append("scope", "openid email profile");
data.append("code", code);
data.append("redirect_uri", "http://" + req.headers.host + req.url);
data.append("client_secret", secret);

xhr.onreadystatechange = () => {
    if (xhr.readyState == 4) {
        console.log(xhr.status + "\n" + xhr.responseText + "\n");
    }
};

xhr.send(data.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...