我们如何为 NodeJS 中的 http get 和 put 请求重用基本身份验证 session?
How can we reuse basic authentication session for http get and put requests in NodeJS?
在下面的代码中,您将看到具有基本身份验证功能的函数:makeGET() 和 makePUT();
此外,您看到的这些代码还在进行中,它们目前正在完成它们的工作。
我需要做的是,在所有后续调用中重用基本身份验证后 session。
如您所见,我尝试将 header 'set-cookie'
存储在变量中并重新使用它。
我在互联网上花了几个小时,但无法为这个问题创建解决方案。
您能否推荐并展示在 NodeJS 中对 http 请求重用基本身份验证 session 的正确方法?
另外,当我尝试通过 PUT 请求存储和重用 cookie 时,服务器会因 CSRF 错误而阻止请求。如何解决这些问题?
谢谢
let authCookie = null;
function makeGET(url, user, pass) {
let reqHeaders = {
'Accept': 'application/json'
};
if(authCookie){
reqHeaders['Cookie'] = authCookie;
}
return new Promise((resolve, reject) => {
http.get(
url,
{
auth: user+':'+pass,
headers: reqHeaders
},
(res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
if(res.headers['set-cookie'] && res.headers['set-cookie'][0]){
authCookie = res.headers['set-cookie'][0];
}
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
authCookie = null;
console.error(error.message);
// Consume response data to free up memory
res.resume();
//resolve("");
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => {
//console.log(chunk)
rawData += chunk;
});
res.on('end', () => {
try {
resolve(rawData);
} catch (e) {
authCookie = null;
console.error(e.message);
resolve("");
}
});
}).on('error', (e) => {
authCookie = null;
console.error(`Got error: ${e.message}`);
resolve("");
});
});
}
function makePUT(host, port, path, user, pass, data) {
return new Promise((resolve, reject) => {
const options = {
host: host,
port: port,
path: path,
method: 'PUT',
headers: {
'Authorization': 'Basic ' + Buffer.from(user + ":" + pass).toString('base64'),
"Content-Type": "application/json"
}
}
const req = http.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`)
console.log(`message: ${res.statusMessage}`)
// console.log(res.headers)
resolve("success");
res.on('data', (d) => {
//process.stdout.write(d)
})
})
req.on('error', (error) => {
console.error(error)
resolve("error");
})
//req.write("")//data
req.end(JSON.stringify(data));
});
}
我觉得很傻,我们用 referrer
而不是 referer
。当我们用正确的名称设置 referer
header 时,session 现在正在被重用。
在下面的代码中,您将看到具有基本身份验证功能的函数:makeGET() 和 makePUT(); 此外,您看到的这些代码还在进行中,它们目前正在完成它们的工作。 我需要做的是,在所有后续调用中重用基本身份验证后 session。
如您所见,我尝试将 header 'set-cookie'
存储在变量中并重新使用它。
我在互联网上花了几个小时,但无法为这个问题创建解决方案。 您能否推荐并展示在 NodeJS 中对 http 请求重用基本身份验证 session 的正确方法?
另外,当我尝试通过 PUT 请求存储和重用 cookie 时,服务器会因 CSRF 错误而阻止请求。如何解决这些问题?
谢谢
let authCookie = null;
function makeGET(url, user, pass) {
let reqHeaders = {
'Accept': 'application/json'
};
if(authCookie){
reqHeaders['Cookie'] = authCookie;
}
return new Promise((resolve, reject) => {
http.get(
url,
{
auth: user+':'+pass,
headers: reqHeaders
},
(res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
if(res.headers['set-cookie'] && res.headers['set-cookie'][0]){
authCookie = res.headers['set-cookie'][0];
}
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
authCookie = null;
console.error(error.message);
// Consume response data to free up memory
res.resume();
//resolve("");
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => {
//console.log(chunk)
rawData += chunk;
});
res.on('end', () => {
try {
resolve(rawData);
} catch (e) {
authCookie = null;
console.error(e.message);
resolve("");
}
});
}).on('error', (e) => {
authCookie = null;
console.error(`Got error: ${e.message}`);
resolve("");
});
});
}
function makePUT(host, port, path, user, pass, data) {
return new Promise((resolve, reject) => {
const options = {
host: host,
port: port,
path: path,
method: 'PUT',
headers: {
'Authorization': 'Basic ' + Buffer.from(user + ":" + pass).toString('base64'),
"Content-Type": "application/json"
}
}
const req = http.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`)
console.log(`message: ${res.statusMessage}`)
// console.log(res.headers)
resolve("success");
res.on('data', (d) => {
//process.stdout.write(d)
})
})
req.on('error', (error) => {
console.error(error)
resolve("error");
})
//req.write("")//data
req.end(JSON.stringify(data));
});
}
我觉得很傻,我们用 referrer
而不是 referer
。当我们用正确的名称设置 referer
header 时,session 现在正在被重用。