Авторизация не всегда проходит.

Mini web-сервер для печати чеков на фискальных регистраторах из мобильных приложений через HTTP запрос JSON.
Ответить
Stozhkov
Сообщения: 18
Зарегистрирован: 17 авг 2017, 16:06

Авторизация не всегда проходит.

Сообщение Stozhkov » 02 июл 2019, 16:29

Здравствуйте.
Из php скрипта пытаюсь выполнить следующий код:

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

$http = ['method' => 'POST',
    'header' => 'Content-Type: application/json'."\r\n".
        'Authorization: Basic '.base64_encode("Admin:password")."\r\n",
    'content' => json_encode(['Command'=>'List'])
];

$stream = stream_context_create(['http'=>$http]);
$result = file_get_contents("http://176.99.99.99:5893/Execute/sync",false, $stream);

print_r([$http_response_header,$result]);

Выполняется, получаю нормальный ответ со списком устройств, но чаще получаю сообщение:

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

Array ( [0] => Array ( [0] => HTTP/1.0 401 Unauthorized [1] => Access-Control-Allow-Origin: * [2] => WWW-Authenticate: Basic realm="Please login!" [3] => content-length: 0 ) [1] => )
Примерно на 1 успешный ответ приходится 5 Unauthorized ответа.

Причем в логе сервера нет записи о выполнении команды когда я получаю список устройств.
А когда я получаю ответ Unauthorized, в логе следующее:

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

Текст команды:
ver: 2.1.22.19 
Host: 176.99.99.99:5893
Connection: close
Content-Length: 18
Content-Type: application/json
Authorization: Basic QWRtaxxxxxxTU0dA==

{"Command":"List"}
Текст ошибки:
Ссылка на объект не указывает на экземпляр объекта.
Низкоуровневые команды:
Нет HTTP ответа
Так же пробую выполнять другие команды, например получаю информацию о последнем чеке:

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

$http = ['method' => 'POST',
        'header' => 'Authorization: Basic '.base64_encode("Admin:password"),
        'contentType' => 'application/json; charset=UTF-8',
        'content' => json_encode(['Command'=>'GetDataCheck',
                                    'NumDevice'=>'1',
                                    'FiscalNumber'=>'0',
                                    'IdCommand'=>'256bb056-156f-722c-2337-037611eff566e',
                                    'NumberCopies'=>'0'])
];

Аналогичная проблема.
Что я делаю не так? Логин пароль я передаю в запросе всегда, а проходит авторизация не каждый раз.

Stozhkov
Сообщения: 18
Зарегистрирован: 17 авг 2017, 16:06

Re: Авторизация не всегда проходит.

Сообщение Stozhkov » 02 июл 2019, 17:59

Сделал через curl. Работает.

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

$data = json_encode(['Command'=>'GetDataCheck',
                    'NumDevice'=>'1',
                    'FiscalNumber'=>'0',
                    'IdCommand'=>'256bb056-156f-732c-1111-055611eff566e',
                    'NumberCopies'=>'0']);

if( $curl = curl_init() ) {
    $request_headers = array();
    $request_headers[] = "Authorization: Basic QWRхххххххU0dA==";
    curl_setopt($curl, CURLOPT_URL, "http://176.99.99.99:5893/Execute/sync");
    curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers);
    curl_setopt($curl, CURLOPT_TIMEOUT, 400);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $out = curl_exec($curl);
    echo $out;
    curl_close($curl);
}
Но все же интересно почему в первом варианте не работало нормально.

Audim
Администратор
Сообщения: 2395
Зарегистрирован: 17 мар 2015, 18:36

Re: Авторизация не всегда проходит.

Сообщение Audim » 02 июл 2019, 23:46

У Вас: "Admin:password"
Вместо "password" - реальный пароль?

Ответить