Node.js Axios отправляет запрос в API с помощью файла cookie

#javascript #node.js #axios

Вопрос:

Я хочу предоставить файл cookie в почтовом запросе с помощью Axios. У меня есть API zeppelin, который работает с CURL как:

 curl -i --data 'userName=adminamp;password=admin' -X POST http://zeppelin.XXXXX.net/api/login
 

и реакция

 HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization,Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, HEAD, DELETE
Content-Length: 127
Content-Type: application/json
Date: Wednesday, September 1, 2021 8:20:55 AM UTC
Server: Jetty(9.4.14.v20181114)
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: JSESSIONID=a3a4392d-1347-47b6-b85b-61230e16802b; Path=/; HttpOnly
Set-Cookie: JSESSIONID=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
Set-Cookie: JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 31-Aug-2021 08:20:55 GMT
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1
 

Чтобы использовать заметку в zeppelin

 curl -i -b 'JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly' -X POST http://zeppelin.XXXXXX.net/api/notebook/job/2G9P1992Z/20210615-091750_1582099873
 

преуспевает с

 HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization,Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, HEAD, DELETE
Content-Length: 15
Content-Type: application/json
Date: Wednesday, September 1, 2021 8:28:07 AM UTC
Server: Jetty(9.4.14.v20181114)
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1
 

У меня есть функция для входа в систему и получения файла cookie

 const axios = require('axios')
const setCookie = require('set-cookie-parser');

const zeppelinLoginCoockie = async function(){
    return new Promise((resolve, reject) => {
        axios
        .post(process.env.ZEPPELIN_URL   'login', 'userName=adminamp;password=admin')
        .then(res => {
            console.log(`statusCode: ${res.status}`);
            //console.log(res);
            let cookies = setCookie.parse(res, {
                decodeValues: true  // default: true
              });
            let lastSessionId = 'null';
            cookies.forEach(element => {
                if ( element.name === 'JSESSIONID' ) {
                    lastSessionId = element.value;
                };
            });
            //console.log(cookies);
            return resolve(lastSessionId);
        })
        .catch(error => {
            console.error(error);
            return reject(error);
        });
    });
}
 

что работает, но теперь я не знаю, как выполнить вторую команду для запуска заметки.

Я попытался предоставить файл cookie, как в:

 const zeppelinNoteRun = async function(loginCookie){
    return new Promise((resolve, reject) => {
        const cookieHeader = `JSESSIONID=${loginCookie}; Path=/; HttpOnly`
        axios
        .post(process.env.ZEPPELIN_URL   'notebook/job/2G9P1992Z/20210615-091750_1582099873', {
            headers:{
                cookie: cookieHeader
            } 
        })
        .then(res => {
            console.log(`statusCode: ${res.status}`);
            return resolve(res);
        })
        .catch(error => {
            console.error(error);
            return reject(error);
        });
    });
}
 

Я не разбираюсь в Axios или файлах cookie, поэтому мне интересно знать, как выполнить такую задачу?

ИЗМЕНИТЬ: опечатка в URL-адресе в узле, хотя принятый ответ был окончательным решением.

Комментарии:

1. Я читал, что это работает только с браузерами. Но попробовал это сейчас, и я получаю Error: Request failed with status code 405

Ответ №1:

Вы передали объект, содержащий файл cookie, в качестве данных POST. Попробуйте добавить значение null после 1-го аргумента axios.post

 axios.post(url, null, {
  headers:{
    cookie: cookieHeader
  } 
})
 

подпись axios.post()

 axios#post(url[, data[, config]])
 

метод axios post

Кстати, перезапись Cookie заголовка на стороне браузера не будет работать по дизайну, независимо от того, используете ли вы собственную выборку или axios на стороне браузера, см. Имя запрещенного заголовка.

Комментарии:

1. Попробовал это, и теперь файл cookie там правильно, но я получаю 404, а Cookie: 'JSESSIONID=c0017ad6-d120-46bc-8fd6-a54d0f0275c7; Path=/; HttpOnly', 'User-Agent': 'axios/0.21.1' с завитком я получаю Cookie: JSESSIONID=14acf05d-3cb3-4548-b8e3-6066caf90000; Path=/; HttpOnly с —verbose ( другой экземпляр, поэтому другой файл cookie)

2. @eemilk Не добавляйте информацию о пути в файл cookie, когда вы делаете запрос, используйте cookie: 'a=1; b=2' plz.

3. Все еще 404. Я общался с JSESSIONID=${loginCookie} джастом и loginCookie и JSESSIONID=${loginCookie}; HttpOnly

4. @eemilk полный журнал??

5. pastebin.com/ia96KZ1E <- full log in the pastebin site