Вход | Регистрация



1C HTTP запрос base auth

1C HTTP запрос base auth
Я
   tabarigen
 
26.11.18 - 10:58
Ребята подскажите пожалуйста, base auth запросы как слать в 1с?
&НаКлиенте
Процедура ОтправитьЗапросНаСайт(Команда)
    Заголовки = Новый Соответствие();
    // Передаем в заголовках размер и тип данных на отправку

    Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    //Заголовки.Вставить("consumer_key", "ck_2c9d1434e7783f46a6a789f756cde9a5517dbda5");

    //Заголовки.Вставить("consumer_secret", "cs_2b815b2a5ff075ac3698fa6dc5f90613d662f1bb");

    Заголовки.Вставить("Authorization: Basic", "ck_2c9d1434e7783f46a6a789f756cde9a5517dbda5:cs_2b815b2a5ff075ac3698fa6dc5f90613d662f1bb"); 
    Соединение =  Новый HTTPСоединение("localhost/apteka149",80);
    
    Запрос = Новый HTTPЗапрос("/wp-json/wc/v3/products/", Заголовки);
    Запрос.УстановитьТелоИзСтроки(JSONСтрока);
    
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    //ЧтениеJSON = Новый ЧтениеJSON;

    //ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

    
    //ОтветСервера = ПрочитатьJSON(ЧтениеJSON);

    ОтветСервера = Ответ.ПолучитьТелоКакСтроку();
КонецПроцедуры

Пробую так не получается.
 
 
   reloc
 
1 - 26.11.18 - 11:15
Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>) 

Указать
<Пользователь>
<Пароль>
   tabarigen
 
2 - 26.11.18 - 11:19
Да пробовал так тоже
   tabarigen
 
3 - 26.11.18 - 11:22
Ответ сервера
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml"; lang="en" xml:lang="en">
<head>
<title>Access forbidden!</title>
<link rev="made" href="mailto:postmmailto:postmaster@localhost";style type="text/css"><!--/*--><![CDATA[/*><!--*/
    body { color: #000000; background-color: #FFFFFF; }

    a:link { color: #0000CC; }

    p, address {margin-left: 3em;}
    span {font-size: smaller;}
/*]]>*/--></style>
</head>

<body>
<h1>Access forbidden!</h1>
<p>


  

    You don't have permission to access the requested directory.
    There is either no index document or the directory is read-protected.

  

</p>
<p>
If you think this is a server error, please contact
the <a href="mailto:postmmailto:postmaster@localhost">webmaster</a>>

<h2>Error 403</h2>
<address>
  <a href="/">localhost</a><br />
  <span>Apache/2.4.37 (Win32) OpenSSL/1.1.1 PHP/7.2.12</span>
</address>
</body>
</html>
   Cyberhawk
 
4 - 26.11.18 - 11:22
Прежде чем из 1С что-то делать добейся чтоб оно из какого-нибудь другого приложения-проверяльщика заработало
   sandal_r
 
5 - 26.11.18 - 11:24
кодируй пару login:password в base64

для пары "user:password" значение будет "dXNlcjpwYXNzd29yZA=="
   sandal_r
 
6 - 26.11.18 - 11:27
+ (5) 
заголовок будет выглядеть так:
Заголовки.Вставить("Authorization", "Basic dXNlcjpwYXNzd29yZA==");
   tabarigen
 
7 - 27.11.18 - 09:17
(4) https://yadi.sk/i/mGn4TVm3rrjkGg
из если напрямую через rest клиент то все рабоает
(6) спасибо за вашу подсказку.
я тоже заметил, что rest клиент преобразует ключ и пароль в какой то хеш и подставляет его в заголовок запроса Authorization

получается мне нужно добиться преобразования моей пары в base64?
   Cyberhawk
 
8 - 27.11.18 - 11:49
(7) "напрямую через rest клиент то все рабоает" // Какие проблемы повторить в 1С?
   sandal_r
 
9 - 28.11.18 - 10:36
(7)
ничего добиваться не надо.
надо преобразовать пару логин:пароль в base64 и подставить в заголовок
   tabarigen
 
10 - 06.12.18 - 14:39
(9) Спасибо всем за помощь.
След код работает
&НаКлиенте
Процедура ОтправитьЗапросНаСайт(Команда)
        
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
    Заголовки.Вставить("Authorization", "Basic " + СоздатьСтрокуBase64("ck_c02d8c902d05e6810a7548eaa07878787878:cs_9cb60c098aa323d3b0130dd7201977777777")); 
    Заголовки.Вставить("Host", "78787887.ru");
    Заголовки.Вставить("Accept", "*/*");
    Заголовки.Вставить("Connection", "keep-alive");
    
    Попытка
        ssl = Новый ЗащищенноеСоединениеOpenSSL(
            Новый СертификатКлиентаWindows(),
            Новый СертификатыУдостоверяющихЦентровWindows());

        Соединение =  Новый HTTPСоединение("8787878.ru",443,,,,5, Новый ЗащищенноеСоединениеOpenSSL);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Запрос = Новый HTTPЗапрос("/wp-json/wc/v3/products/", Заголовки);
    
    Запрос.УстановитьТелоИзСтроки(JSONСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    тЧтение = Новый ЧтениеJSON;
    тЧтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    
    Дн = ПрочитатьJSON(тЧтение,Ложь,,,,,);
    
    
    ОтветСервера = "code: " + Дн.code + Символы.ПС + "status: " + Дн.data.status + Символы.ПС + "message: " + Дн.message;
    ТекущийЭлемент = Элементы.ОтветСервера;
КонецПроцедуры



Правда есть проблема с преобразоваем пары  ключей в base64. код из 1С у меня не сработал. Если использовать сторонние утилиты преобразования, и подставить свормированную base64 строку авторизация успешно проходит.
 
 Рекламное место пустует
   tabarigen
 
11 - 06.12.18 - 14:41
Вот как я в 1с строку перегоняю в base64.
Функция СоздатьСтрокуBase64(Строка) Экспорт

     ВременныйФайл = ПолучитьИмяВременногоФайла();
     
     ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.ANSI);
     ЗаписьТекста.Записать(Строка);
     ЗаписьТекста.Закрыть();
     
     ДД_Файла = Новый ДвоичныеДанные(ВременныйФайл);
     СтрокаBase64 = Base64Строка(ДД_Файла);
     
     УдалитьФайлы(ВременныйФайл);

КонецФункции



Почему результирующая строка содержит какой то  непонятный символ. ¶.
Пробовал от него избавиться СтрЗаменить(СтрокаBase64, "¶", "");, ничего не получилось.
   Lexey_
 
12 - 06.12.18 - 14:53
(11) СтрокаBase64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Строка"))
   tabarigen
 
13 - 06.12.18 - 15:02
(12) тогда я получу
59 32 74 66 59 7A 41 79 5A 44 68 6A 4F 54 41 79 5A 44 41 31 5A 54 59 34 4D 54 42 68 4E 7A 55 30 4F 47 56 68 59 54 41 33 59 6A 52 6A 59 6D 4D 35 5A 6A 51 30 4F 57 59 7A 4D 44 70 6A 63 31 38 35 0D 0A 59 32 49 32 4D 47 4D 77 4F 54 68 68 59 54 4D 79 4D 32 51 7A 59 6A 41 78 4D 7A 42 6B 5A 44 63 79 4D 44 45 35 59 57 49 31 4F 44 5A 6B 4E 6D 59 30 59 6A 55 33
   Lexey_
 
14 - 06.12.18 - 15:04
(13) нет, а ты проверь
   tabarigen
 
15 - 06.12.18 - 15:05
(14) проверил Дарагой
   Lexey_
 
16 - 06.12.18 - 15:07
(15) плохо проверил, скинь скрин отладчика
   tabarigen
 
17 - 06.12.18 - 15:16
   Lexey_
 
18 - 06.12.18 - 15:20
(17) а теперь сравни с кодом в (12)
   tabarigen
 
19 - 06.12.18 - 15:23
(18) Да все верно. была ошибка. Только этот проклятый символ все равно выходит(
   tabarigen
 
20 - 06.12.18 - 15:23
   tabarigen
 
21 - 06.12.18 - 15:28
обоими методами одно и тоже. если эту строку декодировать через сайт https://www.base64encode.net/ то все ок.
   Lexey_
 
22 - 06.12.18 - 15:29
(20) ппц...ты даже готовое решение применить не можешь, на твоем скрине ты вообще никак не используешь код из (12), а получаешь base64 по-своему
   Salimbek
 
23 - 06.12.18 - 15:30
(19) Этот символ либо Перевод строки, либо начальный байт для UTF-8. Точнее - можешь скать ты сам, если переберешь всю строку свою посимвольно и для каждой сделаешь

Сообщить(КодСимвола(ТвояСтрока, Счетчик));
   Lexey_
 
24 - 06.12.18 - 15:32
(21) вычисли в отладчике вот это ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Строка"))
со своей строкой вместо "Строка"
   tabarigen
 
25 - 06.12.18 - 15:33
(24) да блин.
так я это и делаю же.
в (20) на скрине это видно.
   Lexey_
 
26 - 06.12.18 - 15:36
(25) жесть какая...в (20) в отладчике СтрокаBase64, а не то, что я прошу в (24)
   tabarigen
 
27 - 06.12.18 - 15:38
(26) да в курсе я. твой код я отладчиком вычислил, тоже самое. Если хочешь вот тебе еще скрин.
https://yadi.sk/i/zJ_P1aH9DrrTEA
   tabarigen
 
28 - 06.12.18 - 15:40
Мне кажется тут какой  то глюк платформы что ли, юзаю кстати. 8.3.11.3034
   Salimbek
 
29 - 06.12.18 - 15:44
(28) Попробуй выполнить это:
Для Сч = 1 По СтрДлина(ТвояСтрока) Цикл
 _см= Сред(ТвояСтрока, Сч, 1);
 Сообщить("Символ: "+_см+" Код символа: "+КодСимвола(ТвояСтрока, Сч));
КонецЦикла;
   Lexey_
 
30 - 06.12.18 - 15:46
(27) а теперь нажми F2 в отладчике(вычислить в отдельном окне)
   Lexey_
 
31 - 06.12.18 - 15:46
+(30) это перенос строки
   tabarigen
 
32 - 06.12.18 - 15:47
   Salimbek
 
33 - 06.12.18 - 15:48
(32) :-) И что тебе это говорит?
 
 
   tabarigen
 
34 - 06.12.18 - 15:48
(33) Перевод строки?)
   Salimbek
 
35 - 06.12.18 - 15:49
(34) Ну у тебя он есть.
А что: Твоя строка - это цифра 5, потом перевод строки, и потом Y ?
   tabarigen
 
36 - 06.12.18 - 15:50
(35) нет моя строка длинная. на скрине я сразу перешел к странным символам.
   Salimbek
 
37 - 06.12.18 - 15:52
(36) Ну значит смотри - откуда они у тебя взялись.
И да, 13 и 10 - это стандартные символы Перевода строки и Возврата каретки
   tabarigen
 
38 - 06.12.18 - 15:53
(37) Они взялись после выполнения кода 
Строка = "ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9cb60c098aa323d3b0130dd72019ab586d6f4b57";
СтрокаBase64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Строка));
   Lexey_
 
39 - 06.12.18 - 15:56
(38) а почему ты решил, что их там быть не должно?
   dezss
 
40 - 06.12.18 - 15:56
Я что-то не пойму, как такое может быть? Ведь после преобразования в Base64 не должно быть символов 10 и 13
   Salimbek
 
41 - 06.12.18 - 15:56
(38) Т.е.
Строка = "ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9cb60c098aa323d3b0130dd72019ab586d6f4b57";
Для Сч = 1 По СтрДлина(Строка) Цикл
 _см= Сред(Строка, Сч, 1);
 Сообщить("Символ: "+_см+" Код символа: "+КодСимвола(Строка, Сч));
КонецЦикла;

У тебя выдаст Символы 13 и 10 ?
   tabarigen
 
42 - 06.12.18 - 15:56
(39) потому что я передаю строку без всяких символов.
   tabarigen
 
43 - 06.12.18 - 15:57
(41) вот так.
Строка = "ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9cb60c098aa323d3b0130dd72019ab586d6f4b57";
СтрокаBase64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Строка));
Для Сч = 1 По СтрДлина(СтрокаBase64 ) Цикл
 _см= Сред(СтрокаBase64 , Сч, 1);
 Сообщить("Символ: "+_см+" Код символа: "+КодСимвола(СтрокаBase64 , Сч));
КонецЦикла;
   dezss
 
44 - 06.12.18 - 15:58
(39) а откуда они там могут взяться?
   tabarigen
 
45 - 06.12.18 - 15:59
Короч вот финальный вариант. КОторый работает.  Пришлось зачищать полученную строку
&НаКлиенте
Процедура ОтправитьЗапросНаСайт(Команда)
        
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
    Заголовки.Вставить("Authorization", "Basic " + СоздатьСтрокуBase64("ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9cb60c098aa323d3b0130dd72019ab586d6f4b57")); 
    //Заголовки.Вставить("Authorization", "Basic Y2tfYzAyZDhjOTAyZDA1ZTY4MTBhNzU0OGVhYTA3YjRjYmM5ZjQ0OWYzMDpjc185Y2I2MGMwOThhYTMyM2QzYjAxMzBkZDcyMDE5YWI1ODZkNmY0YjU3");

    Заголовки.Вставить("Host", "kyxnimsk.ru");
    Заголовки.Вставить("Accept", "*/*");
    Заголовки.Вставить("Connection", "keep-alive");
    
    Попытка
        ssl = Новый ЗащищенноеСоединениеOpenSSL(
            Новый СертификатКлиентаWindows(),
            Новый СертификатыУдостоверяющихЦентровWindows());

        Соединение =  Новый HTTPСоединение("kyxnimsk.ru",443,,,,5, Новый ЗащищенноеСоединениеOpenSSL);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Запрос = Новый HTTPЗапрос("/wp-json/wc/v3/products/", Заголовки);
    
    Запрос.УстановитьТелоИзСтроки(JSONСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    тЧтение = Новый ЧтениеJSON;
    тЧтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    
    Дн = ПрочитатьJSON(тЧтение,Ложь,,,,,);
    
    
    ОтветСервера = "code: " + Дн.code + Символы.ПС + "status: " + Дн.data.status + Символы.ПС + "message: " + Дн.message;
    ТекущийЭлемент = Элементы.ОтветСервера;
КонецПроцедуры


Функция СоздатьСтрокуBase64(Строка) Экспорт

     СтрокаBase64 =  ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Строка));
     СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
     СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
          
     Возврат СтрокаBase64;

КонецФункции
   tabarigen
 
46 - 06.12.18 - 16:01
Спасибо Salimbek и  Lexey_, помогли
   dezss
 
47 - 06.12.18 - 16:03
А как же обсудить это дело?
Это, по сути, глюк в функционале.
Каким образом может появится перенос строки в данные, преобразованных в base64? О_о
   tabarigen
 
48 - 06.12.18 - 16:06
(47) Да я сам хз, столько времени убил на это.
   tabarigen
 
49 - 06.12.18 - 16:06
пока ребята не помогли
 
 Рекламное место пустует
   Salimbek
 
50 - 06.12.18 - 16:18
(45)(47) Действительно, у себя потестил - после 48-го символа вставляется перевод строки.
Т.е. для "ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9" - в ответе одна строка, а для "ck_c02d8c902d05e6810a7548eaa07b4cbc9f449f30:cs_9c" - уже есть перевод строки.
А если более 96 символов, то второй перевод строки появляется.
З.Ы. 1С 8.3.11.2867
   tabarigen
 
51 - 06.12.18 - 16:28
(50) ну наверное ссылка на эту тему поможет кому то в будущем пока ошибку не исправят)
   Cyberhawk
 
52 - 06.12.18 - 21:16
Может вместо "ПолучитьBase64СтрокуИзДвоичныхДанных" заюзать аналогичные метод "Base64Строка"?
   tabarigen
 
53 - 07.12.18 - 09:48
(52) в (11) так и сделано, результат такой же


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует