使用节点请求 - 如何在基于挑战的网页上进行身份验证?

时间:2017-01-31 20:43:59

标签: javascript node.js request node-modules

探索'request'包以在办公室执行一些自动化任务。

要求是自动登录服务器(但有很多),导航到网页然后收集信息,然后用它创建报告。

事实上,这些服务器首先要求提供用户帐户,然后他们生成一个挑战号码,一个人可以复制并粘贴到另一个服务器中,作为质询响应进行解析。此响应将粘贴回我希望脚本登录的网页。

尝试通过'请求'来弄清楚如何做到这一点。以下代码只能循环到输入用户名的页面:

"use strict"
var request = require('request');

var getJar = request.jar();
var opts = {
    method: 'GET',
    uri: 'https://serverIP/path/to/post/action',
    agentOptions: {
        rejectUnauthorized: false
    },
    jar: getJar,
    followAllRedirects: true
};

var postJar = request.jar();
var postOpts = {
    method: 'POST',
    uri: 'https://serverIP/path/to/post/action',
    form: {
        userName: 'init'
    },
    agentOptions: {
        rejectUnauthorized: false
    },
    postJar: postJar,
    followAllRedirects: true,
    headers: {
        'Referer': 'value I see in dev console'
    }
};

request(opts, function (err, res, body) {

    console.log('GET error is: ' + JSON.stringify(err));
    console.log('GET response is: ' + res);
    console.log('GET body is: ' + body);

    var cookie_string = getJar.getCookieString(opts.uri);
    var cookies = getJar.getCookies(opts.uri);
    console.log(JSON.stringify(cookies) + '\n' + cookie_string);

    postOpts.postJar.setCookie(cookie_string, postOpts.uri);

    request(postOpts, function (err, res, body) {
        console.log('POST error is: ' + JSON.stringify(err));
        console.log('POST response is: ' + res);
        console.log('POST body is: ' + body);

    });
});

代码段中的表单参数是我在Firefox>网络版>下的开发者控制台中看到的内容。 POST请求>通过浏览器提交用户名时的参数。

代码只会将我带回请求用户名的页面。有点卡在那里。我知道这一点,通过将POST主体的值记录到控制台,它会发出请求该值的HTML代码,而不是HTML,您可以看到挑战字符串和输入字段,以便粘贴质询响应。

我可以采取哪些不同的方式?

1 个答案:

答案 0 :(得分:0)

我使用了'request-debug'包进一步了解。事实证明,第一个GET请求成功发生,我从中获取了cookie = sessionId值,并将其注入POST消息jar,如我的初始片段所示。

启用调试后,我能够检测到重定向到URL的错误说明了cookiesRequired'最后,请求正在遵循此重定向并生成第二个GET,在那里我显示了HTML代码,其中包含消息'无效会话,您必须登录'。

然后我发现,cookie会话系统无法正常工作。我从第二个GET看到它插入了一个标题,其中包含从cookie中获取的会话ID。所以我把这个标题注入了postJar,如下所示:

var cookie_string = getJar.getCookieString(opts.uri);   
console.log('ATTENTION--- The cookie from getJar is:\t' + cookie_string);

postOpts.headers.cookie = cookie_string;

此行甚至不影响到目前为止的行为:

    postOpts.jar.setCookie(cookie_string, '/');

插入cookie标题后,我现在被提示解决下一阶段的身份验证。