При интеграции с внешними веб-сервисами, такими как API маркетплейса Леруа Мерлен, разработчики 1С часто сталкиваются с ошибками авторизации, даже если параметры запроса кажутся идентичными примерам из документации. Одной из наиболее частых причин возникновения ошибки 401 (Unauthorized) является некорректная передача параметров в теле HTTPЗапрос при использовании типа содержимого application/x-www-form-urlencoded. Давайте подробно разберем, как избежать подобных проблем.
Если сервер возвращает ошибку 401, это означает, что переданные учетные данные не прошли проверку. Чаще всего проблема кроется не в самой логике платформы 1С, а в том, как именно сформирована строка параметров. Рассмотрим ключевые факторы:
&, +, @), сервер будет воспринимать их как разделители параметров. Это приводит к искажению данных, которые получает API.client_secret, пароль) не содержат скрытых символов, таких как неразрывные пробелы, которые могут случайно попасть в строку при копировании из почты или документа.Когда вы формируете тело запроса для метода application/x-www-form-urlencoded, каждый параметр (ключ и значение) должен быть закодирован. В 1С для этих целей предназначен метод КодировкаСтроки. Если вы используете современную версию платформы, примените его для каждой переменной, содержащей потенциально опасные символы.
Рассмотрим пример правильного формирования тела запроса:
// Предположим, у нас есть переменные:
// username, password, client_id, client_secret
КодированныйПароль = КодировкаСтроки(password, КодировкаСтроки.КодироватьВСтрокуURL);
КодированныйЛогин = КодировкаСтроки(username, КодировкаСтроки.КодироватьВСтрокуURL);
ТелоЗапроса = "grant_type=password" +
"&username=" + КодированныйЛогин +
"&password=" + КодированныйПароль +
"&client_id=" + client_id +
"&client_secret=" + client_secret;
Использование этого подхода гарантирует, что символ &, содержащийся, например, в пароле, превратится в %26, и сервер Леруа Мерлен воспримет его как часть пароля, а не как начало нового параметра.
Если вы не уверены в правильности формирования запроса, крайне рекомендуется воспользоваться инструментами отладки. Даже если установка стороннего ПО на рабочем месте ограничена, вы можете использовать следующие методы:
invalid client secret. Это позволит вам не гадать, а точно знать, какой параметр был отклонен.Давайте соберем все воедино и посмотрим на рабочий пример функции для получения токена:
Функция ПолучитьТокенДоступа(АПИ_Кей, username, password, client_id, client_secret)
Соединение = Новый HTTPСоединение("api.leroymerlin.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/marketplace/oauth/token");
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос.Заголовки.Вставить("x-api-key", АПИ_Кей);
// Формируем тело с учетом кодирования спецсимволов
СтрокаПараметров = СтрШаблон("grant_type=password&username=%1&password=%2&client_id=%3&client_secret=%4",
КодировкаСтроки(username, КодировкаСтроки.КодироватьВСтрокуURL),
КодировкаСтроки(password, КодировкаСтроки.КодироватьВСтрокуURL),
client_id,
client_secret);
Запрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Если Ответ.КодСостояния = 200 Тогда
Возврат ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); // Обработка успешного ответа
Иначе
ЗаписьЖурналаРегистрации("API Леруа", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено;
КонецЕсли;
КонецФункции
Работа с внешними API требует внимательности к деталям формирования HTTP-запросов. Помните, что экранирование спецсимволов — это стандарт индустрии, который позволяет избежать множества ошибок на этапе авторизации. Всегда храните свои учетные данные в защищенных местах (константы, параметры сеанса) и ведите логирование ответов сервера для быстрой диагностики проблем.