我们如何为 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 现在正在被重用。