Приветствую.
Сегодня мы разберем досадную, но, к сожалению, встречающуюся проблему при работе с веб-сервисами на платформе 1С: ошибку формата потока 500 при обработке заголовка Authorization, когда в нем передается схема аутентификации "Bearer " (с пробелом) перед токеном. Ошибка выходила на 24,25,26 релизе платформы 8.3.
Суть проблемы:
В современных веб-приложениях, особенно при использовании OAuth 2.0 и JWT (JSON Web Tokens), стандартным способом передачи токена авторизации в заголовке Authorization является использование схемы "Bearer "<токен>. То есть, заголовок выглядит так:
Authorization: Bearer TOKEN123
Однако, как выясняется на практике, веб-сервис на базе 1С (в зависимости от версии платформы) может некорректно обрабатывать схему "Bearer " и ожидать в заголовке Authorization только чистый токен, без префикса "Bearer " и пробела:
Authorization: TOKEN123
При получении запроса с "Bearer " 1С может выдавать ошибку 500, ошибка формата потока. И вы даже не сможете отладить свой сервис. Так как ошибка идет на уровне платформы. При этом, если отправить запрос с "чистым" токеном (без "Bearer "), все работает корректно.
В чем причина?
Скорее всего, проблема кроется в недостаточной или некорректной реализации обработки заголовка Authorization на стороне платформы 1С. Возможно, код 1С просто ожидает получить токен напрямую и не учитывает стандартную схему "Bearer ", не выполняя парсинг заголовка для извлечения токена из схемы.
Как обойти проблему? Решение через прокси!
Самым эффективным и универсальным способом решения этой проблемы является использование стороннего веб-сервера в качестве прокси-сервера перед вашим 1С веб-сервисом. Прокси-сервер будет выступать в роли "адаптера", принимая входящие запросы с "правильным" заголовком Authorization: Bearer TOKEN123, удалять проблемный префикс "Bearer " и пробел, и перенаправлять уже "очищенный" запрос с заголовком Authorization: TOKEN123 на 1С веб-сервис.
Преимущества прокси-решения:
-
Быстрое и простое внедрение: Настройка прокси-сервера занимает относительно немного времени и не требует внесения изменений в код 1С веб-сервиса.
-
Универсальность: Решение подходит для любых 1С веб-сервисов, испытывающих данную проблему.
-
Гибкость: Прокси-сервер можно настроить на различных платформах и веб-серверах (Nginx, Apache и т.д.).
-
Сохранение стандарта: Клиентские приложения продолжают отправлять запросы, используя стандартную схему "Bearer ", что является правильным с точки зрения безопасности и совместимости.
Как настроить прокси для удаления "Bearer "?
Рассмотрим примеры настройки на двух популярных веб-серверах: Nginx и Apache.
1. Настройка прокси на Nginx:
Nginx - это легкий и мощный веб-сервер, отлично подходящий для проксирования. Вот пример простой конфигурации Nginx для решения нашей проблемы:
server {
listen 80; # Порт, на котором будет слушать прокси
server_name ваш_домен_или_ip_прокси;
location / {
proxy_pass http://адрес_вашего_1с_сервера; # Адрес вашего 1С веб-сервиса
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# *** Удаление "Bearer " из заголовка Authorization ***
proxy_set_header Authorization $http_authorization;
sub_filter 'Bearer ' ''; # Заменяем "Bearer " на пустую строку
sub_filter_once on; # Применяем замену только один раз
}
}
Пояснения к конфигурации Nginx:
-
listen 80;: Прокси-сервер будет принимать запросы на 80 порту (измените при необходимости).
-
server_name ваш_домен_или_ip_прокси;: Укажите доменное имя или IP-адрес вашего прокси-сервера.
-
proxy_pass http://адрес_вашего_1с_сервера;: Укажите адрес вашего 1С веб-сервиса (например, http://192.168.1.10:8080).
-
proxy_set_header ...: Передача оригинальных заголовков запроса на 1С сервер.
-
proxy_set_header Authorization $http_authorization;: Передача заголовка Authorization.
-
sub_filter 'Bearer ' '';: Ключевая строка! Использует модуль ngx_http_sub_module для замены подстроки "Bearer " (с пробелом) на пустую строку в заголовке Authorization.
-
sub_filter_once on;: Применяет замену только один раз.
2. Настройка прокси на Apache:
Если вы используете Apache, настройка прокси также проста, используя модуль mod_headers:
<VirtualHost *:80>
ServerName ваш_домен_прокси_сервера.ru
ProxyPass / http://адрес_вашего_1с_сервера/ # Адрес вашего 1С веб-сервиса
ProxyPassReverse / http://адрес_вашего_1с_сервера/
# *** Удаление "Bearer " из заголовка Authorization ***
RequestHeader edit Authorization "^Bearer\s+" ""
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
</VirtualHost>
Пояснения к конфигурации Apache:
-
<VirtualHost *:80>: Настройка VirtualHost на 80 порту.
-
ServerName ваш_домен_прокси_сервера.ru: Укажите доменное имя прокси-сервера.
-
ProxyPass / http://адрес_вашего_1с_сервера/: Проксирование запросов на 1С веб-сервис.
-
RequestHeader edit Authorization "^Bearer\s+" "": Ключевая строка! Использует модуль mod_headers и директиву RequestHeader edit для замены подстроки "Bearer " (с пробелами) на пустую строку в заголовке Authorization. Регулярное выражение "^Bearer\s+" находит "Bearer " в начале строки и удаляет его.
Альтернативные решения (менее предпочтительные):
-
Изменение клиентского приложения: Если у вас есть контроль над клиентским приложением, отправляющим запросы к 1С, вы можете изменить его, чтобы оно отправляло заголовок Authorization без "Bearer " (только токен). Однако это может быть менее "стандартно" и потребовать изменений на стороне клиента.
Модификация кода 1С веб-сервиса: В идеале, нужно найти работающую версию платформы, у меня не взлетело на 8.3.24.1548, 8.3.24.1819, 8.3.25.1546, 8.3.26.1540 . Заработало на 8.3.23.1782. У заказчика был 24 релиз , поэтому пришла такая идея.
Заключение:
Использование прокси-сервера для "адаптации" заголовка Authorization - это эффективный и быстрый способ обойти проблему некорректной обработки "Bearer " в 1С веб-сервисах. Настройка Nginx или Apache в качестве прокси не займет много времени и позволит вашим веб-сервисам корректно работать с современными клиентами, использующими стандартную схему авторизации.
Надеюсь, эта статья поможет вам решить данную проблему. Если у вас возникнут вопросы или дополнения, пожалуйста, оставляйте комментарии!