Как поддерживать сеанс запроса в NodeJS

#javascript #node.js #get #express-session #node-request

#javascript #node.js #сеанс #запрос

Вопрос:

Я пытаюсь использовать NodeJS для очистки веб-сайта, для которого требуется вход POST . Затем, как только я войду в систему, я смогу получить доступ к отдельной веб-странице с помощью GET .

Первая проблема прямо сейчас — это вход в систему. Я пытался использовать информацию для входа request в POST , но ответ, который я получаю, похоже, не был зарегистрирован.

 exports.getstats = function (req, res) {
    request.post({url : requesturl, form: lform}, function(err, response, body) {
        res.writeHeader(200, {"Content-Type": "text/html"});
        res.write(body);
        res.end();
    });
};
  

Здесь я просто пересылаю страницу, на которую возвращаюсь, но на странице, которую я возвращаю, все еще отображается форма входа, и если я пытаюсь получить доступ к другой странице, она сообщает, что я не вошел в систему.

Я думаю, что мне нужно поддерживать сеанс на стороне клиента и данные cookie, но я не могу найти ресурсов, которые помогли бы мне понять, как это сделать.


В итоге я использовал zombiejs для получения необходимой функциональности

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

1. Можете ли вы опубликовать свой пример с использованием zombiejs? Я застрял с вашей же проблемой, сеанс не поддерживается node.js использование запроса.

Ответ №1:

Вам нужно создать файл cookie jar и использовать один и тот же файл jar для всех связанных запросов.

  var cookieJar = request.jar();
 request.post({url : requesturl, jar: cookieJar, form: lform}, ...
  

Теоретически это должно позволить вам очищать страницы с помощью GET от имени пользователя, вошедшего в систему, но только после того, как вы заработаете фактический код входа. Основываясь на вашем описании ответа на ваше сообщение о входе в систему, это может на самом деле еще не работать правильно, поэтому cookie jar не поможет, пока вы сначала не исправите проблемы в своем коде входа.

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

1. Это очень помогло. Мне все еще не удается войти в систему, как вы сказали. Я не могу понять, чего не хватает. Я использую POST и добавляю данные формы, но по какой-то причине сервер php, к которому я подключаюсь, никогда не отвечает страницей «вход в систему». Я собираюсь продолжать работать над этим

2. Да, это зависит от их кода на стороне сервера, который вы в основном перепроектируете. Вы уверены, что обрабатываете токены CSRF, если они их используют? Возможно, они отслеживают пользовательский агент? Вам нужно сначала ПОЛУЧИТЬ / to get файл cookie сеанса, а затем убедиться, что ваш ПОСТ для входа включает этот файл cookie? И т.д.

3. Я добавил заголовки для пользовательского агента, но я думаю, что они используют сценарии на стороне клиента для входа в систему. В одном из моих ответов я прочитал это «Пожалуйста, включите скрипты для входа в систему». Теперь я застрял:(

4. Используйте Chrome Dev tools для прямой проверки http-запросов и попытайтесь имитировать это в своем коде.

5. Это то, что я делал до сих пор, и это было действительно полезно, но я думаю, что есть некоторые хитрости javascript для системы входа. Я собираюсь пересмотреть свой подход.

Ответ №2:

request.jar(); У меня не сработало. Итак, я использую ответ headers для выполнения другого запроса, подобного этому:

 request.post({
    url: 'https://exampleurl.com/login',
    form: {"login":"xxxx", "password":"xxxx"}
}, function(error, response, body){

    request.get({
        url:"https://exampleurl.com/logged",
        header: response.headers
    },function(error, response, body){
        // The full html of the authenticated page
        console.log(body);
    });
});
  

На самом деле этот способ работает нормально. =D

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

1. Отличный совет. Решен мой аналогичный случай, когда простой отправки файла cookie было недостаточно.

Ответ №3:

Запрос управляет файлами cookie между запросами, если вы его включаете:

Файлы cookie по умолчанию отключены (иначе они использовались бы в последующих запросах). Чтобы включить cookies, установите для jar значение true (либо по умолчанию, либо в параметрах).

 const request = request.defaults({jar: true})
request('http://www.google.com', function () {
  request('http://images.google.com')
});