Воссоздайте запрос на пост HTTP с nodejs от WatchGuard Firebox LoginJavascript

Форум по Javascript
Ответить
Anonymous
 Воссоздайте запрос на пост HTTP с nodejs от WatchGuard Firebox Login

Сообщение Anonymous »

У меня есть WatchGuard Firebox T40-W. Он имеет веб -логин, где вы можете получить доступ к всем видам информации. Поскольку в Firebox нет какой -то документации API (да, я знаю, что WatchGuard Cloud имеет интерфейс API), я попытался просто скопировать все, что происходит на странице входа, чтобы войти в систему. < /P>
Вход имеет две части. Сначала предварительно логин и второго входа в систему. В этом файле есть все, что мне нужно знать.

Код: Выделить всё

 login : function () {
if (!LOGIN.validateForm()) {
return false;
}

$('#submit').button('loading');
var username = $('#username').val();
var password = $('#password').val();
var domain = $('#domain').val();

var obj = {};
var agent_url = '';
var agent_methodName = '';

obj = {password: password, user: username, domain: domain, uitype: '2'};
agent_url = 'agent/login';
agent_methodName = 'login';

$.xmlrpc({
url: agent_url,
methodName: agent_methodName,
params: [obj],
success: LOGIN.loginSuccess,
error: LOGIN.loginError
});

return false;
},
< /code>
Это запрос XMLRPC для получения необходимых данных. Эта часть была довольно легко построить в узле: < /p>
var client = xmlrpc.createSecureClient({ host: this.host, port: this.port, path: '/agent/login'});
var obj = {
password: password,
user: username,
domain: "Firebox-DB",
uitype: '2'
}

// Sends a method call to the XML-RPC server
return new Promise((res, rej) => {
client.methodCall('login', [obj], (error: any, value: any) => {
if (error) {
if (error.code === 409) {
rej(error.faultString)
} else {
rej(error);
}
return;
}
this.sid = value.sid;
this.wga_csrf_token = value.csrf_token;
this.privilege = value.readwrite.privilege + "";
res();
});
});
< /code>
В этой части клиент XMLRPC создается, и запрос будет представлен в то же место, что и исходный скрипт веб -страницы. Это работает и даст мне необходимую информацию для фактического входа. Давайте посмотрим: < /p>
loginSuccess : function (data, textStatus, jqXHR) {
var username = $('#username').val();
var password = $('#password').val();
var domain = $('#domain').val();
var from_page = $('#from_page').val();
var sid = '';
var wga_csrf_token = '';
var cp_csrf_token = $('#cp_csrf_token').val();
var privilege = 0;
var req_id = '';
var mfa_options = '';

var authServer = $('#sel_auth_server').val();

if (data.length > 0) {
sid = data[0].sid;
wga_csrf_token = data[0].csrf_token;
privilege = data[0].readwrite.privilege;
}

data = {
username: username,
password: password,
domain: domain,
sid: sid,
wga_csrf_token: wga_csrf_token,
cp_csrf_token: cp_csrf_token,
privilege: privilege,
from_page: from_page
};

LOGIN.postLogin(data);
},
Новый объект будет создан в login.postlogin () получается:

Код: Выделить всё

postLogin : function (params) {
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "auth/login");

var key, field;
for (key in params) {
if (params.hasOwnProperty(key)) {
field = document.createElement("input");
field.setAttribute("type", "hidden");
field.setAttribute("name", key);
field.setAttribute("value", params[key]);
form.appendChild(field);
}
}

document.body.appendChild(form);
form.submit();
}
Это в основном преобразует объект в невидимую форму и передает его Auth/login как post .
Строительство этой части с помощью Nodejs будет выглядеть так: < /p>

Код: Выделить всё

    const params = new URLSearchParams();
params.append('username', username);
params.append('password', password);
params.append('domain', this.domain);
params.append('sid', this.sid);
params.append('wga_csrf_token', this.wga_csrf_token);
params.append('cp_csrf_token', this.cp_csrf_token);
params.append('privilage', this.privilege);
params.append('from_page', '/');

const response = await fetch(`https://${this.host}:${this.port}/auth/login`, {method: 'POST', body: params, headers: this.httpHeaders });
const data = await response.text();
< /code>
Я получил каждый параметр, который мне нужен с правильным значением. Заголовок устанавливается с помощью session_id = xxx 
, который в каждом запросе на веб -странице Actuall. Код> Ошибка. Похоже, что запрос на веб -странице делает что -то еще, поэтому я только что скопировал все свойства этого заголовка в запрос Nodejs:
< /p>

Код: Выделить всё

private httpHeaders = {
"Cookie": '', // Will be filled by code. Will look like 'session_id=xxx'
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
"Origin": 'https://10.10.10.1:8080',
"Referer": 'https://10.10.10.1:8080/auth/login?from_page=/',
"Accept": 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
"Accept-Encoding": 'gzip, deflate, br, zstd',
"Accept-Language": 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
"Cache-Control": 'max-age=0',
"Connection": 'keep-alive',
"Sec-Ch-Ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
"Sec-Ch-Ua-Mobile": '?0',
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Fetch-Dest": 'document',
"Sec-Fetch-Mode": 'navigate',
"Sec-Fetch-Site": 'same-origin',
"Sec-Fetch-User": '?1',
"Upgrade-Insecure-Requests": '1'
}
сделав это, принесет мне ответ ...
Щелкните запрос внутри Chrome с вкладки Network и Copy => as fetch (nodejs) будет Скопируйте практически то, что я сделал. Запуск этой копированной функции также приведет к такому отклику обновления. Но я заметил, что при удалении реферера из заголовка ответ переключается на 403 - запрещено .
Чего мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ebox-login
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»