Авторизация Java onvif gsoap (ошибка http 401)

Это функция авторизации для моей камеры. У меня ошибки http 401 (несанкционированные) в любых запросах. Запросы без авторизации работают корректно. Я написал этот код, используя документацию: https://www.oasis-open.org/committees/download.php/13392/wss-v1.1-spec-pr-UsernameTokenProfile-01.htm и прослушивание трафика OnvifDeviceManager ( здесь авторизация работает!) . Я отправляю возвращаемое значение из этой функции с помощью пост-метода. Где проблема? Может быть со строковым одноразовым номером? Это случайное число?

public static String getAuthXML(String body)
{
        Date date = new Date(System.currentTimeMillis() - 3 * 3_600_000);
        //time of camera - UTC, time of my PC - GMT+3:00 (3 hours difference)

        String now = dateformat.format(date).concat("T").concat(timeformatptz.format(date).concat("Z"));

        String nonce = "";
        //generate random hex-number (21 symbol)
        while (nonce.length() < 21)
            nonce = nonce.concat(new BigInteger(String.valueOf(date.getTime())).toString(16));
        nonce = nonce.substring(0, 21);

        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.reset();
        md.update(nonce.concat(now).concat(pass).getBytes(StandardCharsets.UTF_8));
        String sha1 = new String(md.digest());

        return "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header><Security s:mustUnderstand=\"1\" xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><UsernameToken><Username>"
                .concat(login)
                .concat("</Username><Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">")
                .concat(pass)
                .concat("</Password><Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest\">")
                .concat(Base64.getEncoder().encodeToString(sha1.getBytes(StandardCharsets.UTF_8)))
                .concat("</Password><Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">")
                .concat(Base64.getEncoder().encodeToString(nonce.getBytes(StandardCharsets.UTF_8)))
                .concat("</Nonce><Created xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">")
                .concat(now)
                .concat("</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">")
                .concat(body)
                .concat("</s:Body></s:Envelope>");
}

P.S.: извините за мой английский, я русский)


person alexbayker    schedule 19.12.2019    source источник
comment
Если я правильно понимаю, цикл while не имеет скобок. Или вы просто хотите зациклить первую строку под условием while?   -  person Maximilian Fixl    schedule 19.12.2019
comment
Я вижу, вы отредактировали его.   -  person Maximilian Fixl    schedule 19.12.2019
comment
Я генерирую случайное шестнадцатеричное число длиной 21 или более символов, используя цикл while. "пока" не нужны скобки, я знаю об этом. Убираю 22-й и последующие символы. Когда я получаю оригинальное случайное число из трафика OnvifDeviceManager - мой код все равно имеет ошибку 401.   -  person alexbayker    schedule 19.12.2019