Использование файлов cookie сеанса в модуле запроса node.js - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать запрос для вызова API на устройстве Fortigate.Метод входа в систему состоит в том, чтобы выполнить POST против /logincheck с учетными данными, а затем использовать файлы cookie ответа для последующих вызовов API.

Эта часть работает нормально, и я получаю файлы cookie.Однако я не вижу заголовок Cookie, когда я выполняю второй вызов, а cookieJar выглядит пустым.

Вот код:

const config = require('./config/config');
const request = require('request');  

var url = `${config.fortigate.adminURL}/logincheck`;
var cookieJar = request.jar();

request.post(
    {
        url : url,
        headers : {

            "Accept": "application/json"
        },
        form: {
            username: config.fortigate.user,
            secretkey: config.fortigate.password
        },
        jar: cookieJar
    },
    function (error, response, body) {

        url = `${config.fortigate.adminURL}/api/v2/monitor/router/ipv4/`;

        request({
            url : url,
            headers : {
                "Accept": "application/json"
            },
            jar: cookieJar
        },
        function (error, response, body) {
            console.log(response.request.headers);
            console.log(response.statusCode);
            console.log(cookieJar);
        });
    }
);

Вывод приведенных ниже команд console.log:

Headers: { Accept: 'application/json' }
Status code: 401
RequestJar {
  _jar:
   CookieJar {
     enableLooseMode: true,
     store: { idx: { '192.168.1.99': { '/': {} } } } } }

Я прочитал руководство здесь https://github.com/request/request, но все еще не могу заставить его работать.

Также нашел другой пост, в котором есть решение, но другоелюди также имеют проблемы с ним: Как поддерживать сеанс запроса в NodeJS

Конечно, я что-то пропустил, но что?Есть идеи?


Обновление

Срок действия файлов cookie истекает с 1969 года. Может быть, файл cookie не сохраняется в памяти файлов cookie между запросами?

Cookie="APSCOOKIE_2739400828="0%260"; Expires=Fri, 09 May 1969 12:47:54 GMT; Path=/; Secure; SameSite=Strict; hostOnly=true; aAge=6ms; cAge=6ms"

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Хотя это не ответ, но приведенный ниже код отлично работает для меня.

const express = require('express')
const app = express();
const request = require('request')
app.use(express.urlencoded({extended: true}));
app.listen(8080, () => console.log('server running on 8080'))


const jar = request.jar();

app.get('/', function(req, res){
    request.post({
        url: 'http://localhost:8080/post',
        form: {
                    username: 'Shobhit',
            },
            jar
    }, () => {
        request({
                    url : 'http://localhost:8080/dummy',
                    jar
            },
             () => {
                    console.log(jar)
            res.end()
            });
    })
})

app.get('/dummy', function(req, res){
    res.end();
})

app.post('/post', function(req, res){
    console.log(req.body);
    let randomNumber= Math.random().toString();
        randomNumber = randomNumber.substring(2,randomNumber.length);
    res.cookie('tough-cookie', randomNumber, {  maxAge: 900000, httpOnly: true });
    res.end();
})

В банке в конце второго запроса содержится файл cookie, установленный в предыдущем запросе.

    RequestJar {
  _jar:
   CookieJar {
     enableLooseMode: true,
     store: { idx: { localhost:
   { '/':
      { 'tough-cookie': Cookie="tough-cookie=33128391647421696; Expires=Sat, 27 Apr 2019 14:02:46 GMT; Max-Age=900; Path=/; HttpOnly; hostOnly=true; aAge=3ms; cAge=7ms" } } } } } }
0 голосов
/ 27 апреля 2019

Это немного неловко.Я наконец нашел проблему, которая у меня была, и оказалось, что мои учетные данные не имели необходимого доступа.Так как я настроил учетную запись администратора REST, я предполагал, что это будет работать, но это не так.Вместо этого я добавил обычную учетную запись администратора, и она работала нормально.

Что заставило меня понять, это то, что я сравнил необработанные заголовки set-cookie в Chrome после успешного входа в систему с теми, которые я получил от NodeJS.Содержимое не соответствовало тому же шаблону.

Вот пример кода для аутентификации на брандмауэре Fortinet с использованием Node.js:

const config = require('./config/config');
const request = require('request');
const fs = require('fs');

var url = `${config.fortigate.adminURL}/logincheck`;

var cookieJar = request.jar();
const req = request.defaults({
     agentOptions: {
         ca: fs.readFileSync('./caroot.crt'),   
     },
     jar: cookieJar
})

req.post(
    {
        url : url,
        headers : {
            "Accept": "application/json"
        },
        form: {
            username: config.fortigate.user,
            secretkey: config.fortigate.password
        }        
    },
    function (error, response, body) {

        url = `${config.fortigate.adminURL}/api/v2/monitor/router/ipv4/`;

        req.get({
            url : url,
            headers : {
                "Accept": "application/json"
            }
        },
        function (error, response, body) {
            console.log(body);
        });
    }
);

Надеюсь, это кому-нибудь поможет.

...