Каков алгоритм авторитизации по 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.

Пока, чтобы авторизоваться получается так:

  1. надо через post-запрос на 192.168.31.1/cgi-bin/luci/api/xqsystem/login

подать 4 переменные: username, password, logtype,nonce

при этом мы знаем, что всегда username ='admin', а logtype = '2'

password и nonce надо рассчитывать. Вот по этим рассчётам и непонятно

  1. Получить токен (а именно значение stok, скорее всего из refer ссылки из ответа-сервера) и с ним уже по Get-запросу (или post) получать данные.

Ответы (0 шт):