【问题标题】:Using session cookies in the node.js request module在 node.js 请求模块中使用会话 cookie
【发布时间】:2019-09-16 07:52:04
【问题描述】:

我正在尝试使用 request 对 Fortigate 设备进行 API 调用。登录方法是使用凭据对 /logincheck 进行 POST,然后使用响应 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 的手册,但仍然无法使用。

还找到了另一个确实有解决方案的帖子,但其他人也有问题: How to maintain a request session in NodeJS

当然我错过了什么,但是什么?有什么想法吗?


更新

cookies 在 1969 年过期。也许 cookie jar 在请求之间没有持久保存在内存 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"

【问题讨论】:

  • 您能否检查一下您是否从第一个 API 调用中获得了响应 cookie?
  • 是的,第一次通话后我确实收到了。

标签: node.js session cookies node-request


【解决方案1】:

虽然不是答案,但下面的代码对我来说很好。

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();
})

第二个请求结束时的jar包含前一个请求中设置的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" } } } } } }

【讨论】:

  • 非常感谢您花时间帮助我解决这个问题,非常感谢!
【解决方案2】:

这有点尴尬。我终于找到了我遇到的问题,结果证明我的凭据没有所需的访问权限。由于我配置了一个 REST 管理员帐户,我认为它可以工作,但它没有。相反,我添加了一个普通的管理员帐户,效果很好。

让我意识到这是在成功登录后将 Chrome 中的原始 set-cookie 标头与我从 NodeJS 获得的标头进行比较。内容没有遵循相同的模式。

这是使用 Node.js 针对 Fortinet 防火墙进行身份验证的示例代码:

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

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多