#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')
});