如何在NodeJS中维护请求会话

Rya*_*yan 34 javascript session request node.js

我正试图用来NodeJS刮一个需要登录的网站POST.然后,一旦我登录,我就可以访问一个单独的网页GET.

第一个问题,现在被登录.我试图使用requestPOST的登录信息,但我得到的回应没有出现在被记录.

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();
    });
};
Run Code Online (Sandbox Code Playgroud)

在这里我只是转发我回来的页面,但我回来的页面仍然显示登录表单,如果我尝试访问另一个页面,它说我没有登录.

我想我需要维护客户端会话和cookie数据,但我找不到任何资源来帮助我理解如何做到这一点.


作为后续,我最终使用zombiejs来获得我需要的功能

Pet*_*ons 43

您需要制作一个cookie jar并对所有相关请求使用相同的jar.

 var cookieJar = request.jar();
 request.post({url : requesturl, jar: cookieJar, form: lform}, ...
Run Code Online (Sandbox Code Playgroud)

从理论上讲,这应该允许您使用GET作为登录用户来抓取页面,但只有在您获得实际登录代码时才会这样做.根据您对登录POST的响应的描述,实际上可能无法正常工作,因此在您首先修复登录代码中的问题之前,cookie jar将无济于事.

  • 是的,这取决于他们的服务器端代码,你基本上是逆向工程.如果使用CSRF令牌,您确定要处理CSRF令牌吗?他们可能会嗅探用户代理吗?您是否必须首先获取会话cookie然后确保您的登录POST包含该cookie?等等. (2认同)

Hen*_*ava 12

request.jar();对我不起作用.所以我使用头响应来发出另一个这样的请求:

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

Actualy这种方式工作正常.= d