POST запрос возвращает код 400 в толстом клиенте, в тонком работает, в чем беда?

1. dikd 17 09.03.22 11:27 Сейчас в теме
Добрый день!

Уже всю голову себе сломал, может тут умные люди помогут?)

Есть элементарный POST-запрос к HTTPs сервису, который по логину и паролю переданным в json возвращает "токен" для дальнейшей авторизации с другими запросами.

Если этот код выполняется в тонком клиенте с разбивной на выполнение &НаКлиенте и &НаСервере, то токен в итоге сервис возвращает, если РОВНО ЭТОТ ЖЕ КОД выполняется в толстом клиенте, то в ответ сервис присылает "код=400"

Код для ТОНКОГО клиента, который норм отрабатывает:

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура КомандаПолучитьТокен(Команда)
	Токен = ПолучитьТокен();
КонецПроцедуры

#КонецОбласти // ОбработчикиКомандФормы

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция НастройкиПодключения() Экспорт
	
	Результат = Новый Структура(
		"Сервер, Порт, Таймаут, ЗащищенноеСоединение, Логин, Пароль",
		Сервер,
		Порт,
		Таймаут,
		ЗащищенноеСоединение,
		Логин,
		Пароль);
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПолучитьТокен(НастройкиПодключения = Неопределено) Экспорт
	
	Попытка
		
		Если НастройкиПодключения = Неопределено Тогда
			НастройкиПодключения = НастройкиПодключения();
		КонецЕсли;
		
		Если НастройкиПодключения.ЗащищенноеСоединение Тогда
			ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL;
		Иначе
			ЗащищенноеСоединениеOpenSSL = Неопределено;
		КонецЕсли;
		
		HTTPСоединение = Новый HTTPСоединение(
			НастройкиПодключения.Сервер,
			НастройкиПодключения.Порт,
			,
			,
			,
			НастройкиПодключения.Таймаут,
			ЗащищенноеСоединениеOpenSSL);
		
		Данные = Новый Структура;
		Данные.Вставить("login", НастройкиПодключения.Логин);
		Данные.Вставить("password", НастройкиПодключения.Пароль);
		
		ЗаписьJSON = Новый ЗаписьJSON;
		ЗаписьJSON.УстановитьСтроку();
		ЗаписатьJSON(ЗаписьJSON, Данные);
		ТелоЗапроса = ЗаписьJSON.Закрыть();
		
		АдресРесурса = "auth/sign-in";
		
		HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
		HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
		
		HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
		
		HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
		
		Если НЕ HTTPОтвет.КодСостояния = 201
			И НЕ HTTPОтвет.КодСостояния = 200 Тогда
			ВызватьИсключение "Код состояния: " + HTTPОтвет.КодСостояния;
		КонецЕсли;
		
		СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
		Ответ = ПрочитатьJSON(ЧтениеJSON, Ложь);
		ЧтениеJSON.Закрыть();
		
		Токен = Ответ["token"];
		
		Если Токен = "" Тогда
			ВызватьИсключение "Токен пустой";
		КонецЕсли;
		
	Исключение
		
		Токен = "";
		
		ТекстСообщения = "Не удалось получить токен:"
			+ Символы.ПС + ОписаниеОшибки();
		
		ЗаписатьВЖурнал(ТекстСообщения,, "Загрузка данных", УровеньЖурналаРегистрации.Ошибка);
		
	КонецПопытки;
	
	Возврат Токен;
	
КонецФункции
Показать




КОД ДЛЯ ТОЛСТОГО КЛИЕНТА (чуть упрощен, но все основные фунции сохранены), вот он не работает:
Функция ПолучитьТокен() 
	Логин =  "**********"; 
	Пароль = "**********";    
	
	ssl1 = Новый ЗащищенноеСоединениеOpenSSL;
	
	HTTPСоединение = Новый HTTPСоединение("sintec.club",11000,,,,60,ssl1);
	
	
	Данные = Новый Структура;
	Данные.Вставить("login", Логин);
	Данные.Вставить("password", Пароль);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Данные);
	ТелоЗапроса = ЗаписьJSON.Закрыть();
	
	АдресРесурса = "auth/sign-in";
	
	HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
	
	HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
	
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
	
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	
	Если НЕ HTTPОтвет.КодСостояния = 201
		И НЕ HTTPОтвет.КодСостояния = 200 Тогда
		Сообщить("Код состояния: " + HTTPОтвет.КодСостояния);
	КонецЕсли;
	
	СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
	Ответ = ПрочитатьJSON(ЧтениеJSON, Ложь);
	ЧтениеJSON.Закрыть();
	
	Токен = Ответ["token"];
	
	Возврат Токен;
	
КонецФункции
Показать


То есть "верхний" запускаю, например из УТ 11, токен получаю.
"Нижний" код запускаю из УТ 10.3 и в итоге Код ответа = 400, типа ошибка в запросе.

Проверялось на одинаковых версиях платформ, на разных, в том числе на 8.3.20.1710
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 09.03.22 11:31 Сейчас в теме
(1) Верхний работает на сервере, нижний на клиенте. У вас клиент и сервер разные компьютеры?
3. dikd 17 09.03.22 11:32 Сейчас в теме
(2)
Верхний работает на сервере, нижний на клиенте. У вас клиент и сервер разные компьютеры?

Это всё файловые базы, один комп.
4. RustamZz 09.03.22 11:33 Сейчас в теме
(3) Режим совместимости какой у УТ 10.3?
5. dikd 17 09.03.22 11:35 Сейчас в теме
(4) Да, кстати это мысль...
у УТ 10.3 (типовая крайняя версия) Режим совместимости 8.2.13
6. RustamZz 09.03.22 11:35 Сейчас в теме
7. dikd 17 09.03.22 11:37 Сейчас в теме
(6)
SSL там друг

Что значит другой? Меня Админы сервиса и наши шпыняют друг к другу, чей в итоге касяк? Админы сервиса должны какой-то "старый" SSL разрешить на сервисе у себя, или что? Не подскажете?
8. RustamZz 09.03.22 11:40 Сейчас в теме
(7) Поддержка TLS 1.2 появилась в 8.3.9
14. dikd 17 09.03.22 12:08 Сейчас в теме
(8)
Поддержка TLS 1.2 появилась в 8.3.9


Спасибо за наводку! всё получилось!)
9. VictorRGB2 14 09.03.22 11:42 Сейчас в теме
(7) HTTPСоединение = Новый HTTPСоединение()

там копать надо
для разных версий платформ он разный был

вот так у нас для УТ 10.3 работает
Соединение = Новый HTTPСоединение(<СервисАдрес>);

и тоже самое но для УТ 11
Соединение = Новый HTTPСоединение(<СервисАдрес>,,,,,, Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено));
10. dikd 17 09.03.22 11:44 Сейчас в теме
(9)
Это я всё в курсе, гляньте код, там всё ок.
Дело видимо и правда в версии TSL.... щас сменю режим совместимости в УТ 10.3 на то, под которым работает запрос в УТ 11, не факт конечно что получится, там же всякие функции еще меняются, перестают действовать, или наоборот новые появляеются... но попробую
11. VictorRGB2 14 09.03.22 11:49 Сейчас в теме
(10) у нас взлетело именно так, как я показал, смена режима совместимости не помогала
но было и такое, что ничего вообще не помогало, без отключения проверки сертификата никак не работало, а для 8.2 этого не сделать, пришлось мутить через winhttp
если надо, могу дать пример кода
12. dikd 17 09.03.22 11:53 Сейчас в теме
(11) Да, если не сложно, дайте код Ваш)
15. VictorRGB2 14 09.03.22 12:11 Сейчас в теме
(12)
WinHttp = ПодключитьВнешнююКомпоненту("WinHttp.WinHttpRequest.5.1");
		
		WinHttp.Option(2,"utf-8");
		
		//Отключаем проверку сертификата
		Если отключитьSSLсертификат = 1 Тогда
			Скрипт= ПодключитьВнешнююКомпоненту("MSScriptControl.ScriptControl"); 
			Скрипт.language="javascript"; 
			Скрипт.AddObject("WinHttp",WinHttp); 
			Скрипт.Eval("WinHttp.Option(4)=13056"); // intSslErrorIgnoreFlags 
			Скрипт.Eval("WinHttp.Option(6)=true");  // blnEnableRedirects 
			Скрипт.Eval("WinHttp.Option(12)=true"); // blnEnableHttpsToHttpRedirects
		КонецЕсли;
		
		WinHttp.Open("POST", <СервисАдрес>+"/"+<СервисаAPIРесурс>, 0);
		
		WinHttp.setRequestHeader("Content-Type"	, "application/json; charset=utf-8");
		WinHttp.setRequestHeader("X-ProductKey"	, <СервисКлючДоступа>);
		WinHttp.Send(СтруктураДанныхJSON);
	Исключение
		СообщитьПользователю(ОписаниеОшибки());
		ОтветРезультат = 402;
		Возврат ОтветРезультат;
	КонецПопытки;
	
	ОтветРезультат = WinHttp.Status;
Показать
16. dikd 17 09.03.22 12:14 Сейчас в теме
(15)
Спасибо, но получилось победить просто сменой режима совместимости УТ 10.3 на 8.3.9
17. VictorRGB2 14 09.03.22 12:18 Сейчас в теме
(16) и отлично, что все получилось и не пришлось творить извращений, как мы ))
18. dikd 17 09.03.22 12:21 Сейчас в теме
(17)Но сейчас всё же попробую с помощью Вашего года, так как смена совместимости тянет за собой кучу исправлений типового кода, думаю дальше если придётся обновлять конфигурацию, то это вылезет в большую проблему
13. dikd 17 09.03.22 12:07 Сейчас в теме
Ура! победил! В УТ 10.3 сменил режим совместимости на 8.3.9
поправил пару функций в коде на которые начало ругаться после смены совместимости и мой код заработал!)
Оставьте свое сообщение

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