我正在尝试使用请求对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
我肯定错过了什么,但是呢?有什么想法吗?
cookie的过期时间为1969年。也许cookie罐在请求之间的内存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"
答案 0 :(得分: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" } } } } } }
答案 1 :(得分:0)
这有点尴尬。我终于找到了我遇到的问题,事实证明我的凭据没有所需的访问权限。由于我配置了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);
});
}
);
希望它可以帮助某人。