Различия в формировании HTTP запроса из платформы на PC и мобильной платформы

1. markivkin 37 15.03.22 22:03 Сейчас в теме
Добрый день!

Странная история: есть сайт с 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, не работает на мобильном устройстве.
Найденные решения
10. markivkin 37 20.03.22 20:43 Сейчас в теме
Решение довольно тривиальное, если заголовки http-запроса формировать специально для базовой авторизации, то работает и с мобильного приложения. Что типа такого:

Функция ЗаголовкиДляМобильногоПриложения(ИмяПользователя, Пароль)
	СтрокаАвторизации = СтрШаблон("%1:%2", ИмяПользователя, Пароль);
	СтрокаАвторизации64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации));
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", СтрШаблон("Basic %1", СтрокаАвторизации64));
	Возврат Заголовки;
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. laperuz 47 16.03.22 04:27 Сейчас в теме
Так может там используется при запросе логин/пароль текущего пользователя?
На PC он есть и заполнен, а на мобильных устройствах пользователей в БД нет.
3. maksa2005 551 16.03.22 06:56 Сейчас в теме
(2)согласен. При авторизации по api делать надо с пользователем в бд сервера api, а не тот кто авторизовался в мобильном клиенте.
4. starik-2005 3090 16.03.22 08:05 Сейчас в теме
А код есть? Откуда при вызове сервиса в случае компа появляется юзер?
5. markivkin 37 16.03.22 21:27 Сейчас в теме
Коллеги, код конечно есть, он тривиален до безобразия. Из формы вызывается функция в которую передаются данные

Функция ПолучитьДанныеПользователя(АдресСайта, ИмяПользователя, Пароль) Экспорт

В ней создается соединение, дергается запрос и все!

И это код работает если запустить на компьютере, и запуск того же кода, с вводом тех же самых данных пользователя не работает именно на мобильной платформе. Логи я приводил.

Правда я дергал метод соединения вот так Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);

Пойду еще в варианте Получить(<HTTPЗапрос>, <ИмяВыходногоФайла>) попробую! Единственный альтернативный вариант, но надежд не питаю. Скорей всего особенности работы или ошибка мобильной платформы.

Дополнительно: мобильный отладчик подключал, смотрел на мобильном девайсе и в эмуляторе. Данные пользователя в функцию попадают.
6. markivkin 37 16.03.22 21:39 Сейчас в теме
Бесполезно, альтернативный способ дернуть GET-метод ровно с таким же результатом. Собственно это и ожидалось. Библиотека под капотом должна быть той же самой. Приплыл... Проект на грани провала. Надо уходить в нативную разработку на андроид.
7. laperuz 47 17.03.22 06:06 Сейчас в теме
(6) Проверьте с вот этим сервером:

Соединение = Новый HTTPСоединение("httpbin.org",, "user", "passwd",,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("basic-auth/user/passwd");                                              
Ответ = Соединение.Получить(Запрос);
Сообщить(Ответ.ПолучитьТелоКакСтроку());


У меня работает и с компьютера и с телефона. Мобильное приложение выгружено из версии 8.3.20.1674, версия сборщика и мобильной платформы 8.3.21.16.

Если нужно, могу прислать apk для проверки.
markivkin; +1 Ответить
8. markivkin 37 17.03.22 19:08 Сейчас в теме
(7) Большое спасибо за наводку! Как то упустил этот момент, у меня платформа постарше 8.3.19.1264. Возможно в новых версиях заработает.
9. markivkin 37 19.03.22 12:15 Сейчас в теме
(7) Обновление не помогло, все тоже самое. laperuz, сори что затянул с ответом, не было возможности сразу сделать вызовы и большое спасибо за возможность проверить на стороннем сервисе. Оба варианта с ним работают. В логах примерно в 12.03-12.05 обращение. Интересно, запросы отличаются? Первый раз дергал из запущенного приложения, второй раз из мобильной платформы, из эмулятора.

По логам точно ясно, что запросы отличаются. В строке лога приведенной в первом сообщении нет имени пользователя. Ушел разбираться что не так....
10. markivkin 37 20.03.22 20:43 Сейчас в теме
Решение довольно тривиальное, если заголовки http-запроса формировать специально для базовой авторизации, то работает и с мобильного приложения. Что типа такого:

Функция ЗаголовкиДляМобильногоПриложения(ИмяПользователя, Пароль)
	СтрокаАвторизации = СтрШаблон("%1:%2", ИмяПользователя, Пароль);
	СтрокаАвторизации64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации));
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", СтрШаблон("Basic %1", СтрокаАвторизации64));
	Возврат Заголовки;
КонецФункции
Показать
11. laperuz 47 21.03.22 03:55 Сейчас в теме
(10) Прямо очень странно. Сколько делал МП на 1С с вызовами сервисов, ни разу не сталкивался с проблемами. Видится, что тут в самом сервисе дело..
12. markivkin 37 21.03.22 19:38 Сейчас в теме
(11) Если интересны подробности, на сервере вертится Django, API поднята с использованием Django REST framework. Может что то с сервисом, но проявляется так, как будто в заголовке данные авторизации не отправляются... или отправляются в каком то ином виде, в таком, котором этот сервис их не понимает. Для подтверждения гипотезы было бы интересно перехватить http-запрос с мобильного устройства, но копать в ту сторону бросил, как только заработало.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот