Различия в формировании HTTP запроса из платформы на PC и мобильной платформы
Добрый день!
Странная история: есть сайт с api на сервере, доступ по https с авторизацией. В разработке мобильное приложение которое должно получать данные с сервера. При разработке дергаю сервис из приложения запущенного на компьютере, все работает отлично. Запускаю на мобильном приложении получаю ошибку 403 "Учетные данные не были предоставлены". Код одинаковый, но работает по разному из платформы 1с на PC и на мобильной платформе.
Попросил логи веб-сервера, вот такая картина:
Платформа на PC: 78.107.201.153 - user123 [14/Mar/2022:17:34:56 +0000] "GET /api/user/user123/ HTTP/1.1" 200 8 "-" "1C+Enterprise/8.3"
Мобильная платформа: 78.107.201.153 - - [14/Mar/2022:17:36:46 +0000] "GET /api/user/user123/ HTTP/1.1" 403 82 "-" "1C+Enterprise/8.3"
Отсутствует пользователь, в верхней строке он есть "user123", в нижней нет.
Есть подозрение что это ошибка или особенность мобильной платформы. Кто нибудь сталкивался с такой особенностью? Есть идеи как можно обойти проблему?
Код тривиальный создается соединение, выполняется GET запрос. И код работает только на PC, не работает на мобильном устройстве.
Странная история: есть сайт с api на сервере, доступ по https с авторизацией. В разработке мобильное приложение которое должно получать данные с сервера. При разработке дергаю сервис из приложения запущенного на компьютере, все работает отлично. Запускаю на мобильном приложении получаю ошибку 403 "Учетные данные не были предоставлены". Код одинаковый, но работает по разному из платформы 1с на PC и на мобильной платформе.
Попросил логи веб-сервера, вот такая картина:
Платформа на PC: 78.107.201.153 - user123 [14/Mar/2022:17:34:56 +0000] "GET /api/user/user123/ HTTP/1.1" 200 8 "-" "1C+Enterprise/8.3"
Мобильная платформа: 78.107.201.153 - - [14/Mar/2022:17:36:46 +0000] "GET /api/user/user123/ HTTP/1.1" 403 82 "-" "1C+Enterprise/8.3"
Отсутствует пользователь, в верхней строке он есть "user123", в нижней нет.
Есть подозрение что это ошибка или особенность мобильной платформы. Кто нибудь сталкивался с такой особенностью? Есть идеи как можно обойти проблему?
Код тривиальный создается соединение, выполняется GET запрос. И код работает только на PC, не работает на мобильном устройстве.
Найденные решения
Решение довольно тривиальное, если заголовки http-запроса формировать специально для базовой авторизации, то работает и с мобильного приложения. Что типа такого:
Функция ЗаголовкиДляМобильногоПриложения(ИмяПользователя, Пароль)
СтрокаАвторизации = СтрШаблон("%1:%2", ИмяПользователя, Пароль);
СтрокаАвторизации64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации));
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", СтрШаблон("Basic %1", СтрокаАвторизации64));
Возврат Заголовки;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Коллеги, код конечно есть, он тривиален до безобразия. Из формы вызывается функция в которую передаются данные
Функция ПолучитьДанныеПользователя(АдресСайта, ИмяПользователя, Пароль) Экспорт
В ней создается соединение, дергается запрос и все!
И это код работает если запустить на компьютере, и запуск того же кода, с вводом тех же самых данных пользователя не работает именно на мобильной платформе. Логи я приводил.
Правда я дергал метод соединения вот так Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
Пойду еще в варианте Получить(<HTTPЗапрос>, <ИмяВыходногоФайла>) попробую! Единственный альтернативный вариант, но надежд не питаю. Скорей всего особенности работы или ошибка мобильной платформы.
Дополнительно: мобильный отладчик подключал, смотрел на мобильном девайсе и в эмуляторе. Данные пользователя в функцию попадают.
Функция ПолучитьДанныеПользователя(АдресСайта, ИмяПользователя, Пароль) Экспорт
В ней создается соединение, дергается запрос и все!
И это код работает если запустить на компьютере, и запуск того же кода, с вводом тех же самых данных пользователя не работает именно на мобильной платформе. Логи я приводил.
Правда я дергал метод соединения вот так Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
Пойду еще в варианте Получить(<HTTPЗапрос>, <ИмяВыходногоФайла>) попробую! Единственный альтернативный вариант, но надежд не питаю. Скорей всего особенности работы или ошибка мобильной платформы.
Дополнительно: мобильный отладчик подключал, смотрел на мобильном девайсе и в эмуляторе. Данные пользователя в функцию попадают.
Бесполезно, альтернативный способ дернуть GET-метод ровно с таким же результатом. Собственно это и ожидалось. Библиотека под капотом должна быть той же самой. Приплыл... Проект на грани провала. Надо уходить в нативную разработку на андроид.
(6) Проверьте с вот этим сервером:
У меня работает и с компьютера и с телефона. Мобильное приложение выгружено из версии 8.3.20.1674, версия сборщика и мобильной платформы 8.3.21.16.
Если нужно, могу прислать apk для проверки.
Соединение = Новый HTTPСоединение("httpbin.org",, "user", "passwd",,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("basic-auth/user/passwd");
Ответ = Соединение.Получить(Запрос);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
У меня работает и с компьютера и с телефона. Мобильное приложение выгружено из версии 8.3.20.1674, версия сборщика и мобильной платформы 8.3.21.16.
Если нужно, могу прислать apk для проверки.
(7) Обновление не помогло, все тоже самое. laperuz, сори что затянул с ответом, не было возможности сразу сделать вызовы и большое спасибо за возможность проверить на стороннем сервисе. Оба варианта с ним работают. В логах примерно в 12.03-12.05 обращение. Интересно, запросы отличаются? Первый раз дергал из запущенного приложения, второй раз из мобильной платформы, из эмулятора.
По логам точно ясно, что запросы отличаются. В строке лога приведенной в первом сообщении нет имени пользователя. Ушел разбираться что не так....
По логам точно ясно, что запросы отличаются. В строке лога приведенной в первом сообщении нет имени пользователя. Ушел разбираться что не так....
Решение довольно тривиальное, если заголовки http-запроса формировать специально для базовой авторизации, то работает и с мобильного приложения. Что типа такого:
Функция ЗаголовкиДляМобильногоПриложения(ИмяПользователя, Пароль)
СтрокаАвторизации = СтрШаблон("%1:%2", ИмяПользователя, Пароль);
СтрокаАвторизации64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации));
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", СтрШаблон("Basic %1", СтрокаАвторизации64));
Возврат Заголовки;
КонецФункции
Показать
(11) Если интересны подробности, на сервере вертится Django, API поднята с использованием Django REST framework. Может что то с сервисом, но проявляется так, как будто в заголовке данные авторизации не отправляются... или отправляются в каком то ином виде, в таком, котором этот сервис их не понимает. Для подтверждения гипотезы было бы интересно перехватить http-запрос с мобильного устройства, но копать в ту сторону бросил, как только заработало.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот