При разработке мобильных приложений, взаимодействующих с 1С через HTTP-сервисы, часто возникает задача реализовать авторизацию без создания полноценных пользователей в базе данных 1С. Это особенно актуально для складских систем или торговых представителей, где важна привязка не к конкретному человеку, а к физическому устройству. Рассмотрим подробно, как реализовать надежную систему авторизации, какие заголовки использовать и как обеспечить безопасность данных.
Часто у разработчиков возникает соблазн использовать стандартный заголовок Authorization: Digest для передачи своих параметров (например, уникального ID устройства или самодельного токена). Проанализируем, почему это может быть плохой идеей. Веб-серверы (такие как Apache или IIS), на которых публикуются сервисы 1С, при получении заголовка Authorization со значением Digest или Basic могут попытаться обработать его самостоятельно согласно стандартам RFC.
Если формат ваших данных в этом заголовке не будет соответствовать ожиданиям веб-сервера, запрос может быть отсечен еще до того, как он попадет в 1С. Вы получите ошибку 401 Unauthorized или 400 Bad Request. Поэтому, если мы создаем «доморощенную» систему, лучше использовать нестандартные заголовки. Разберем наиболее подходящие варианты:
X-, например: X-Device-ID или X-Custom-Auth.Authorization, но с типом Bearer (например, Authorization: Bearer <ваш_токен>). Веб-серверы обычно игнорируют содержимое Bearer и передают его приложению «как есть».URL), хотя этот метод считается менее безопасным, так как параметры могут логироваться сервером.Существует распространенное заблуждение, что при использовании протокола HTTPS шифруется только тело запроса. Выясним реальное положение дел: при использовании SSL/TLS шифруется абсолютно всё, что идет после установления соединения. Это включает в себя:
URL запроса (путь и параметры после знака вопроса).HTTP (включая Cookie и Authorization).Body).Открытым остается только доменное имя сервера (через SNI), чтобы пакеты могли быть доставлены по назначению. Следовательно, передавать секретные ключи или токены в заголовках через HTTPS абсолютно безопасно.
Что касается работы в сетях с плохим покрытием (GPRS/Edge), то современные протоколы TLS 1.3 минимизируют задержки при «рукопожатии» (handshake). Рекомендуется использовать механизм Keep-Alive, чтобы не устанавливать соединение заново для каждого мелкого запроса. Это значительно повышает скорость обмена в «ебенях», как выразился автор темы.
Рассмотрим сценарий, когда нам нужно завязаться на конкретный девайс. Поскольку современные мобильные ОС ограничивают доступ к аппаратным IMEI, правильным подходом будет генерация собственного GUID при первом запуске приложения.
Проанализируем алгоритм «наколенной» авторизации, который предложил автор и который является вполне рабочим:
DeviceID, СекретныйКлюч и Соль (рандомное число или временная метка).DeviceID и Соль, находим в базе секретный ключ этого устройства, сами вычисляем хеш и сравниваем его с тем, что прислал клиент.Для реализации хеширования в 1С используем объект МенеджерХеширования. Рассмотрим пример кода для проверки подписи:
Функция ПроверитьАвторизацию(Запрос)
ИдентификаторУстройства = Запрос.Заголовки.Получить("X-Device-ID");
ПрисланныйХеш = Запрос.Заголовки.Получить("X-Signature");
Соль = Запрос.Заголовки.Получить("X-Nonce");
// Получаем секретный ключ из справочника устройств в 1С
СекретныйКлюч = ПолучитьКлючУстройства(ИдентификаторУстройства);
Хеширование = Новый МенеджерХеширования(ХешФункция.SHA256);
Хеширование.Добавить(ИдентификаторУстройства + СекретныйКлюч + Соль);
ЭталонныйХеш = НРег(СтрЗаменить(Строка(Хеширование.Хеш()), " ", ""));
Возврат ПрисланныйХеш = ЭталонныйХеш;
КонецФункции
Важным преимуществом использования собственной авторизации внутри HTTP-сервиса является экономия ресурсов. Если использовать штатную авторизацию 1С (через список пользователей базы данных), то на каждый запрос от мобильного устройства платформа будет пытаться создать полноценный сеанс. Если устройств сотни, это создаст колоссальную нагрузку на сервер («сеансовый бум») и может быстро исчерпать доступные лицензии.
Рекомендуемый подход:
Все запросы от мобильных приложений приходят под одним служебным пользователем 1С с минимальными правами (только на чтение/запись необходимых объектов). А вот разделение прав и идентификация «кто именно пришел» происходит уже программно внутри кода метода HTTP-сервиса на основании переданных заголовков. Это позволяет эффективно переиспользовать сеансы HTTP и экономить лицензии.
Подведем итог и определим лучшие практики для построения такой системы:
nonce (одноразовый номер). Сервер должен помнить последние использованные номера и не принимать запрос с тем же номером повторно.GET, POST, DELETE) и всегда доступны в объекте HTTPСервисЗапрос.Посмотрим, как удобно получать данные заголовков в коде 1С:
Метод = Запрос.Заголовки.Получить("X-Action-Type");
Если Метод = "SyncData" Тогда
// Логика синхронизации
ИначеЕсли Метод = "Ping" Тогда
// Ответ для проверки связи
КонецЕсли;
Таким образом, использование кастомных заголовков для авторизации — это надежный и гибкий инструмент, если соблюдать правила работы с протоколом HTTP и не пытаться имитировать стандартные механизмы веб-серверов там, где это не требуется.