Каков алгоритм авторитизации по API к роутеру xiaomi Redmi AC2100 для подключения через скрипт на GROOVY
Есть необходимость подключаться по API к роутеру xiaomi Redmi AC2100.
Какой-либо документ с описанием API найти не удалось.
Решил поисследовать админку роутера. На данный момент стоит стандартная последняя прошибка от Xiaomi.
Для входа нужно ввести только пароль.
При вводе пароля осуществлется POST-запрос на URL:
http://192.168.31.1/web/cgi-bin/luci/api/xqsystem/login
При неправильном вводе ответот JSON: {"code":401,"msg":"Invalid token"}
Обрабатывается пароль javascript на фронтенде:

Пароль обрабатывается,шифруется.Если авторитизация неуспешно,то ругается, что некорректный токен. Если пароль был введен корректно,то перенаправляемся на ссылку типа:
http://192.168.31.1/cgi-bin/luci/;stok=XXXXXXXXXXXXXXXXXXXXXX/web/home#router
где XXXXXXXXXXXXXXXXXXXXXX - это и есть наш токен.
Поискав на GIT нашел пару проектов по подключению к роутреру:
https://github.com/scientifichackers/pymiwifi/tree/49a40b163e528e149b89a98ea210c41f0d012d90
https://github.com/art-sitedesign/xiaomi-router-api/
https://github.com/Veeenz/MiWifi4-Router-Api/
По коду полностью не смог осознать алгоритм подключения,поэтому решил еще посмотреть javascript при успешном подключении:
Получается, что после обработки пароля через java-script идет POST-запрос на
http://192.168.31.1/cgi-bin/luci/api/xqsystem/login
с передачей данных Form-date:
username: admin
password: 6e6a105ca953e341e70077d8ceadeb3a700bf45
logtype: 2
nonce: 0_11:e0:4c:5c:c8:ee_1634477925_5623
Из java-скрипта кусок кода:
var Encrypt = {
key: 'a211a5c9be07488bbb04a3a47d3c5f6a',
iv: '64175472482204614961023454661220',
nonce: null,
init: function(){
var nonce = this.nonceCreat();
this.nonce = nonce;
return this.nonce;
},
nonceCreat: function(){
var type = 0;
var deviceId = '11:e0:4c:5c:c8:ee';
var time = Math.floor(new Date().getTime() / 1000);
var random = Math.floor(Math.random() * 10000);
return [type, deviceId, time, random].join('_');
},
oldPwd : function(pwd){
return CryptoJS.SHA1(this.nonce + CryptoJS.SHA1(pwd + this.key).toString()).toString();
},
newPwd: function(pwd, newpwd){
var key = CryptoJS.SHA1(pwd + this.key).toString();
key = CryptoJS.enc.Hex.parse(key).toString();
key = key.substr(0, 32);
key = CryptoJS.enc.Hex.parse(key);
var password = CryptoJS.SHA1(newpwd + this.key).toString();
var iv = CryptoJS.enc.Hex.parse(this.iv);
var aes = CryptoJS.AES.encrypt(
password,
key,
{iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
).toString();
return aes;
}
};
Собственно, не получается понять алгоритм, который в последующем необходимо реализовать в скрипте на Groovy.
Пока, чтобы авторизоваться получается так:
- надо через post-запрос на 192.168.31.1/cgi-bin/luci/api/xqsystem/login
подать 4 переменные: username, password, logtype,nonce
при этом мы знаем, что всегда username ='admin', а logtype = '2'
password и nonce надо рассчитывать. Вот по этим рассчётам и непонятно
- Получить токен (а именно значение stok, скорее всего из refer ссылки из ответа-сервера) и с ним уже по Get-запросу (или post) получать данные.
