我正在尝试使用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发出相同的请求时,我从端点获得了正确的响应。请帮我调试一下。
答案 0 :(得分:0)
我在restService中添加了'Content-Length'
标头,如下所示
if(!!requestOptions.body){
requestOptions.headers = requestOptions.headers || {};
requestOptions.headers['Content-Length'] = requestOptions.body.length;
}
现在按预期工作。不知道为什么login.microsoftonline.com
会为丢失的标题返回404
。