Onedrive oauth,代码流程步骤2无效

时间:2017-08-03 10:30:59

标签: node.js https oauth-2.0 onedrive

我正在尝试使用this文档为我的应用程序实现OneDrive连接。我从参数中获得了code,并尝试使用文档中代码流的第2步来检索access_token。我的服务器是NodeJS应用程序。

我有一个名为restService的自定义服务,用于从服务器发出REST请求。这是它的代码

const https = require('https'); 
let makeRequest = (host, endPoint, method, requestOptions={}) => {
    return new Promise ( (resolve, reject) =>{
        var options = {
            host: host,
            port: 443,
            path: endPoint,
            method: method,
            headers :  requestOptions.headers || {}
        };
        var req = https.request(options, function(response) {
            let body = "";
            response.on('data', (d) => {
                body += d;
            });
            response.on('end', function() {
                resolve({
                    statusCode : response.statusCode,
                    body : body
                })
            });
            response.on('error', function() {
               reject("Error while making request");
            });
        });

        if(!!requestOptions.body){
            req.write(requestOptions.body);
        }
        req.on('error', (e) => {
            console.error("ERROR WHILE MAKING API call to " + host + " :", e)
            reject(e);
        });
        req.end();
    })
}

使用上述服务,我发出检索access_token的请求,如代码流程的第2步所述,如下所示

let endpoint = "/common/oauth2/v2.0/token";
let body = "grant_type=authorization_code&client_id="+config.onedrive.client_id
                +"&redirect_uri="+encodeURIComponent(config.onedrive.redirect_uri)
                +"&client_secret="+config.onedrive.client_secret+"&code="+code;
let requestOptions = {
    headers : {
        "Content-Type" : "application/x-www-form-urlencoded"
    } ,
    body : body
}
restService.makeRequest("login.microsoftonline.com", endpoint, "POST", requestOptions)
.then( data=>{console.log(data)})

但无论我做什么,我都会得到回复

{
   statusCode : 404
   body : ""
}
来自restService.makeRequest()的

。但是,当从POSTMAN发出相同的请求时,我从端点获得了正确的响应。请帮我调试一下。

1 个答案:

答案 0 :(得分:0)

我在restService中添加了'Content-Length'标头,如下所示

if(!!requestOptions.body){
    requestOptions.headers = requestOptions.headers || {};
    requestOptions.headers['Content-Length'] =  requestOptions.body.length;
}

现在按预期工作。不知道为什么login.microsoftonline.com会为丢失的标题返回404