Авторизация OAuth 2.0 в API Google и получение access token для сервисной учетной записи, не требует подтверждения пользователя

25.03.18

Интеграция - WEB-интеграция

Обработка получает google api access token методом two-legged OAuth (2LO), это вариант сервер-сервер с цифровой подписью, когда не требуется подтверждение пользователя. Заполняет гугл-таблицу через API. При ее работе также происходит парсинг закрытого RSA-ключа PEM, результат парса выводится в форму.

Скачать файлы

Наименование Файл Версия Размер
(8.3.10 и 8.3.11) Авторизация OAuth 2.0 в API Google и получение access token для сервисной учетной записи, не требует подтверждения пользователя:
.epf 20,30Kb
125
.epf 1.1 20,30Kb 125 Скачать
(8.3.9) Авторизация OAuth 2.0 в API Google и получение access token для сервисной учетной записи, не требует подтверждения пользователя:
.epf 20,86Kb
10
.epf 1.1 20,86Kb 10 Скачать

Пока в интернете я встречал только описание использования из 1С "Трехногого OAUth" (three-legged OAuth), где вызов API идет от имени конечного пользователя и обычно требуется подтверждение пользователя. Способ на мой взгляд длинноватый, поэтому я решил вызвать из 1Ски по-человечески двуногую авторизацию: "two-legged OAuth," или "2LO". Делал на платформе 8.3.10.2168, протестировал также на 8.3.11.3034. Добавлено 17.07.2018: вариант обработки для платформы 8.3.9 (проверено на 8.3.9.2033 и 8.3.9.2233)

Речь идет о модели авторизации, описанной:
краткое описание с картинкой - https://developers.google.com/identity/protocols/OAuth2#serviceaccount
подробное - https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Этот способ требует создания и криптографического подписывания JSON Web Tokens (JWT). На данный момент встроенным Менеджером Криптографии 1ска не умеет подписывать SHA256 хеш, а гугл другого не приемлет. Изначально я использовал COM-объект System.Security.Cryptography.RSACryptoServiceProvider. Он работал как надо, но смущало, что в документации не написано, что он так умеет (в опциях метода SignHash отсутствует вариант SHA256). Для гарантии, что будет работать на другом компьютере, я решил вычислить цифровую подпись "вручную" обычной арифметикой, которую достойно выдержала 1С. Примечательно, что при этом она оперирует десятичными 309-значными числами, и подпись вычисляет за пару секунд. Триста девять - это не опечатка, вот например, значение одной из переменных типа Число, используемых при вычислении:

502 980 391 062 131 532 641 704 729 356 208 435 540 985 711 615 837 230 131 224 218 031 451 499 103 580 000 500 
042 512 824 109 317 254 211 102 144 888 404 960 708 248 565 484 714 907 166 675 270 791 229 966 881 267 979 216 
170 431 549 149 990 776 636 979 550 241 423 110 985 244 106 352 654 087 401 423 069 254 226 452 760 694 752 994 
636 816 447 756 286 216 072 699 194 804 391 178 250 315 913 588 444 283 437

На 8.3.9 вычисляет дольше, но тоже за приемлемое время - похоже, используются не все ядра процессора.

Обработка получает токен от имени сервисной учетной записи моего тестового проекта. Scope запрашивается только для API spreadsheets. Для демонстрации работоспособности полученного токена, из формы обработки можно изменить столбец тестовой гугл-таблицы, а затем по указанному на форме обработки адресу посмотреть результат.

Для получения токенов на api spreadsheets от имени Вашего сервис-аккаунта, необходимо в консоли разработчика https://console.developers.google.com создать/скачать JSON-ключ сервисного аккаунта с доступом к api spreadsheets, и указать его в поле обработки "Путь файла ключа json". Токен своей учетки Вы получите, но при попытке изменить мою тестовую таблицу с таким токеном гугл вернет error 403 "PERMISSION_DENIED", поскольку у Вашего сервис-аккаунта нет доступа к моей таблице.

При воспроизведении в своей работе аналога продемонстрированного механизма не забудьте прописать нужные Вам "scope" в коде обработки и соответствующие API при запросе у гугла json-ключа. Также не забудьте расшарить доступ к объектам гугла, которые Вы хотите изменять или читать через API. Доступ нужно предоставлять емейлу Вашей сервисной учетной записи. Этот емейл можно найти внутри json ключа, в значении свойства "client_email", либо в моей обработке указать путь к Вашему JSON-ключу и нажать кнопку "разобрать сертификат". Емейл отобразится в поле "Расшарить для емейла".

Важный момент: в операционной системе должно быть правильное время и правильный часовой пояс (используется функция 1с УниверсальноеВремя), иначе обработка запросит у гугла неверные дату начала и окончания срока действия токена, как следствие токен не выдадут, в ответе будет что-то со словом time. Если правильные системное время и пояс устанавливать не хотите - тогда нужно в модуле формы указать свой алгоритм расчета времени для переменной ВремяИстеченияUTC. Учитывайте, что в данной схеме авторизации гугл выдает токены максимум на час, затем нужно получать новый токен.

Для разбирающихся в криптографии. Цифровая подпись арифметически вычисляется с использованием SHA256withRSA (RSASSA-PKCS1-V1_5-SIGN with the SHA-256 hash function). Для этого в процессе обработки средствами 1С происходит парсинг закрытого RSA-ключа в формате PEM, BASE64 которого содержится в сертификате JSON. На вкладке "Парс сертификата json" в дерево выводится результат парсинга, и в ветке дерева "OCTET STRING" содержится SEQUENCE, в котором перечислены INTEGER - параметры закрытого и открытого ключей: Version, Modulus, publicExponent (Exponent, E), privateExponent (D), prime1 (P), prime2 (Q), exponent1 (dP или d mod (p-1)), exponent2 (dQ или d mod (q-1)), coefficient (InverseQ или InvQ или (inverse of q) mod p).

Google API OAuth 2 JWT access token криптография цифровая подпись RSA PEM токен закрытый ключ сертификат ключа Google spreadsheets Гугл таблицы

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15749    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17557    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16362    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25746    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88588    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. uginx 11.07.18 06:52 Сейчас в теме
2. uginx 12.07.18 16:40 Сейчас в теме
а не подскажете как добавлять строку в конец листа?

у меня на такую строку
/v4/spreadsheets/1u3hBxBn0hHfOOyJ6TjLzsji58SPP3ttNyRN31xTgUk­E/values/Sheet2:append?valueInputOption=USER_ENTERED
ругается с кодом 404

а так
/v4/spreadsheets/1u3hBxBn0hHfOOyJ6TjLzsji58SPP3ttNyRN31xTgUk­E/values/Sheet2?valueInputOption=USER_ENTERED
работает, но записывает с начала листа
3. uno-c 235 12.07.18 20:01 Сейчас в теме
Здравствуйте. Если нужно добавить новую дополнительную пустую строку (т.е. на странице последняя строка, в которую можно что-то записать была 969я, нужно, чтоб появилась 970я строка), то нужно использовать POST по адресу https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate, при этом в теле нужно передать JSON {"requests": [ { "appendDimension": { "sheetId": sheetId, "dimension": "ROWS", "length":1}}]} https://developers.google.com/sheets/api/samples/rowcolumn#append_empty_rows_or_columns
4. uginx 13.07.18 06:31 Сейчас в теме
(3) спасибо! поменял HTTPСоединение.Записать на HTTPСоединение.ОтправитьДляОбработки
5. uno-c 235 13.07.18 10:54 Сейчас в теме
Отлично!

Конечно же, важно не путать методы HTTPСоединение (HTTPConnection):
Записать (Put)
ОтправитьДляОбработки (Post)
Получить (Get)
6. kasper076 101 28.11.18 15:45 Сейчас в теме
Реально работает. Спасибо.
7. kasper076 101 29.11.18 10:15 Сейчас в теме
В данном примере сертификат содержится в файле формата JSON. А если сертификат в файле cer, как тогда можно достать закрытый ключ?
8. uno-c 235 29.11.18 12:07 Сейчас в теме
(7)В .cer обычно только открытый ключ. Google выдавал еще .p12 - из него ключи можно достать например через powershell.
$cert = New-Object system.security.cryptography.x509certificates.x509certificate2
$pat="d:\UNSAFE\dell\mySert.p12"
$password="notasecret"
$flags = "UserKeySet,Exportable"
$cert.Import($pat, $password, $flags)
$myXml = $cert.PrivateKey.ToXmlString($True)
$myXml | Out-File "d:\UNSAFE\dell\FromPower.xml"
Ключи и параметры для ускоренного расчета будут видны в файле FromPower.xml, ими можно вычислять цифровую подпись для гугла.
9. kasper076 101 30.11.18 10:00 Сейчас в теме
(8) Некорректно сформулировал свой вопрос. Вот тут ты используешь COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider") для подписи файла по алгоритму RSA-sha256. А в обработке из этой темы СОМ-объект не используется. Возможно ли только средствами 1С подписать и поверить подпись RSA-sha256, если сертификат лежит в файле cer?
10. uno-c 235 30.11.18 11:42 Сейчас в теме
(9)Если закрытый ключ содержится в файле - думаю можно, т.к. у эски есть инструменты для работы с двоичными данными. Но повторю, в .cer как правило нет закрытого ключа, нужен .pfx или .p12.
11. kasper076 101 30.11.18 11:56 Сейчас в теме
(10) pfx тоже есть. Но при экспорте из хранилища сертификатов был запрошен ввод пароля. На Хабре прочитал, что это дополнительная защита закрытого ключа, сам файл pfx шифруется с помощью этого пароля.
Я попробовал разобрать файл cer используя алгоритм из обработки. Но результат получился не корректным. Получились классы не входящие в формат ASN.1
Прикрепленные файлы:
12. uno-c 235 30.11.18 13:03 Сейчас в теме
(11)Шифруется потому что содержит закрытый ключ. Значит, если сильно хочется эской - нужно разбирать и расшифровывать ). Посмотрел пару закрытых ключей в pfx - они зашифрованы 3DES SHA-1. Но это совсем для 1с-гурманов ). Менеджер криптографии вроде только с асимметричным шифрованием работает, т.е. придется алгоритм расшифровки вручную прописывать, если хочется без COM или Native.
13. kasper076 101 30.11.18 13:28 Сейчас в теме
(12) Ну мы не такие :-) . Решили прост отказаться от RSA-sha256. Нам нельзя использовать сторонние библиотеки.
14. uno-c 235 30.11.18 14:22 Сейчас в теме
(13)Да, средствами эски расшифровывать закрытый ключ из pfx неоправданно трудоемко будет. Разве что для какой-нибудь дипломной работы - из теоретического интереса решить задачку.
53. uno-c 235 01.11.19 20:30 Сейчас в теме
(11)Извините, просто памятка. На днях наткнулся, удобная штуковина для разбора ASN.1 https://lapo.it/asn1js/

И уж раз начал писать - то в моей обработке - да, я не делал универсальный разбор любых файлов ASN, а ограничился только тем, что было необходимо для разбора json-сертификатов от Гугла.
15. Cyberhawk 135 29.07.19 12:01 Сейчас в теме
В чем отличие между двумя вложениями?
16. uno-c 235 29.07.19 13:21 Сейчас в теме
(15)Здравствуйте! В версии (8.3.9) дописаны некоторые функции для работы с двоичными данными, которые отсутствуют в платформе 8.3.9. Если версию обработки 8.3.9 запустить на более поздних платформах - то будет ругаться из-за конфликта имен функций встроенных в платформу и написанных мной, тогда нужно просто удалить область
#Область Для_8_3_9
// в 8.3.10 эти функции встроены в платформу

&НаСервере
Функция ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер)
...
#КонецОбласти
17. Cyberhawk 135 29.07.19 13:58 Сейчас в теме
(16) Благодарю за ответ и за публикацию
18. skyboy13 13 25.09.19 11:09 Сейчас в теме
Про SHA256 в 1С, это соответственно АлгоритмХеширования. Что-то у него даже описания нет....
19. uno-c 235 25.09.19 11:26 Сейчас в теме
(18)Вы имеете в виду описание в СП МенеджерКриптографии-АлгоритмХеширования-SHA256? Выше в статье я писал "На данный момент встроенным Менеджером Криптографии 1ска не умеет подписывать SHA256 хеш, а гугл другого не приемлет." В СП его нет, но можно обратиться к любому модулю криптографии Новый МенеджерКриптографии(<ИмяМодуляКриптографии ...), потом .
ПолучитьИнформациюМодуляКриптографии(), и в нем есть массив .АлгоритмыХеширования - там найдете полный перечень алгоритмов хеширования, с которыми справится 1С платформенными средствами, SHA256 пока там отсутствует.
62. uno-c 235 29.05.20 03:54 Сейчас в теме
(18) Просто памятка. 1С:Предприятие 8.3.15.1869, МенеджерКриптографии, поддерживаемые алгоритмы хеширования по криптопровайдерам:
1."Microsoft Base Cryptographic Provider v1.0" (тип 1) : SHA-1, MD2, MD4, MD5
2."Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" (тип 13) : SHA-1, MD5
3."Microsoft Base DSS Cryptographic Provider" (тип 3) : SHA-1, MD5
4."Microsoft Base Smart Card Crypto Provider" (тип 1) : SHA-1, MD2, MD4, MD5
5."Microsoft DH SChannel Cryptographic Provider" (тип 18) : SHA-1, MD5
6."Microsoft Enhanced Cryptographic Provider v1.0" (тип 1) : SHA-1, MD2, MD4, MD5
7."Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" (тип 13) : SHA-1, MD5
8."Microsoft Enhanced RSA and AES Cryptographic Provider" (тип 24) : SHA-1, MD2, MD4, MD5
9."Microsoft RSA SChannel Cryptographic Provider" (тип 12) : SHA-1, MD5
10."Microsoft Strong Cryptographic Provider" (тип 1) : SHA-1, MD2, MD4, MD5
20. ivanovkpd 03.10.19 13:25 Сейчас в теме
Добрый день.

Я немного соптимизировал, как мне кажется, генерацию JSON для передачи на гугл
Во первых, использую метод batchUpdate, он позволяет избавиться от необходимости указания range в url, во вторых ф-я глобального контекста ЗаписатьJSON, позволяет избавиться от вложенного цикла.

Функция ДжонИзМассива(Знач Масс, Рэйнж, Знач НачСтрока = 1,
		Знач НачКолонка = 1, Знач Лист = "Лист1") Экспорт

	Данные = Новый Структура();
	ValueRange = Новый Структура();
	Колонок = Масс.количество();
	Строк = Масс[0].Количество();
	Рэйнж = СтрШаблон("%1!%2:%3", Лист, НотацияА1(НачКолонка, НачСтрока), НотацияА1(НачКолонка
		+ Колонок + 1, НачСтрока + Строк + 1));

	ValueRange.Вставить("range", Рэйнж);
	ValueRange.Вставить("majorDimension", "COLUMNS");
	ValueRange.Вставить("values", Масс);

	Данные.Вставить("valueInputOption", "USER_ENTERED");
	Данные.Вставить("data", ValueRange);

	Джсон = Новый ЗаписьJSON();
	Джсон.УстановитьСтроку();
	ЗаписатьJSON(Джсон, Данные);
	Возврат Джсон.Закрыть();
КонецФункции
Показать
21. uno-c 235 03.10.19 14:40 Сейчас в теме
(20)Здравствуйте! Цель этой обработки - получить access token. Гугл-таблица в ней заполняется лишь для проверки работоспособности полученного токена. ЗаписатьJSON и ПрочитатьJSON глобального контекста - да, как правило удобней и лаконичней эти функции использовать.
22. ivanovkpd 03.10.19 15:24 Сейчас в теме
(21) Да я ж не спорю! Она мне ОЧЕНЬ помогла, хоть и промучился несколько дней из-за невнимательности своей :)

Я не вам в упрек ни в коем случае.
24. uno-c 235 03.10.19 16:48 Сейчас в теме
(22)Я к тому, что вдруг кто будет читать перед тем, как скачать эту обработку. Обработка позволит не тратить время на изучение нудной процедуры получения токена. Плюс она отвязана от операционной системы, работает на линуксе, т.к. не использует обращение к криптопровайдеру через COM для вычисления цифровой подписи, а вычисляет сама чистой арифметикой. Но дальнейшее использование полученного токена - это уже предмет других примеров-обработок.
23. ivanovkpd 03.10.19 15:28 Сейчас в теме
(21) Кстати обнаружил неприятный нюанс - Googe Sheet API не понимает JSON-format даты/времени.

Посему, перед применением ЗаписатьJSON приходится все даты конвертить в строки, все в тех же мерзких циклах. :(
25. uno-c 235 03.10.19 17:30 Сейчас в теме
(23)В спецификации JSON отсутствует дата, отсюда и проблема. Т.е. нету такого понятия, как "JSON-format даты/времени". RFC7159:
JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays).

Использующие обмен данными в формате JSON сами принимают решение, как передавать даты в форме строки. В 1С есть три встроенных варианта для этого - например в функциях глоб.контекста ПрочитатьДатуJSON(...) ЗаписатьДатуJSON(...) - ISO, JavaScript, Microsoft. В глоб.контекст. ЗаписатьJSON - тоже третьим параметром можно передать настройки сериализаци, в том числе для даты с тремя этими вариантами. Но google sheets api, видимо, какой-то четвертый формат использует )
26. ivanovkpd 04.10.19 09:23 Сейчас в теме
(25) а вот настройки сериализации я что-то не попробовал, спасибо.
Гугл принимает dd-MM-yyyy HH:mm:ss, если стоит параметр USER_ENTERED, а RAW я не пробовал :)
(24) Не, обработка просто шикарная! 100500й раз спасибо вам :) Вы, по-моему вообще единственный кто реализовал 2-leg авторизацию.
27. uno-c 235 04.10.19 09:39 Сейчас в теме
(26)
а RAW я не пробовал :)
Судя по инструкции гугла, можно и не пробовать ):
RAW The values the user has entered will not be parsed and will be stored as-is.
USER_ENTERED The values will be parsed as if the user typed them into the UI. Numbers will stay as numbers, but strings may be converted to numbers, dates, etc. following the same rules that are applied when entering text into a cell via the Google Sheets UI.
В JSON либо строка либо число, других вариантов в данном случае нет. И в случае RAW - все останется как есть - строкой или числом.
28. uno-c 235 04.10.19 09:42 Сейчас в теме
(26)
100500й раз спасибо вам :)
А Вам спасибо за отзыв !
29. Cthulhu 1 09.10.19 14:02 Сейчас в теме
(20)
упс. выглядит красиво (я так понял в вывод (начиная с А1 в целевой гугл-таблице) кидается содержимое Масс.
тупой вопрос: а как собственно Масс формируется для таб.документа (или области)?..
прим:
31. пользователь 09.10.19 14:28
Сообщение было скрыто модератором.
...
30. Cthulhu 1 09.10.19 14:09 Сейчас в теме
спасибо!
тупые (снова, уж извините) вопросы.
а как именно "взаимоувязываются" линк на гугл-таблицу с кодом? в смысле - где и как в коде указывается, что именно эта таблица правится через api?..
32. пользователь 09.10.19 15:45
Сообщение было скрыто модератором.
...
33. Cthulhu 1 09.10.19 17:55 Сейчас в теме
(32) о тут уже оказывается отрезан обмен сообщениями - тупо редирект в телегу и прочее (которого у меня нет).
спасибо, добрый человек. надеюсь автор топикстартер извинит за диалог тут.
1) понятно что в константе - непонятно что оно (ТабИД) собой представляет и как его получить...
2) вижу у тебя тупо ТЗ выгоняется в гугль-шит? а как таб.документ?
35. ivanovkpd 09.10.19 18:43 Сейчас в теме
(33)
Мне табДокумент не нужен, я выгружаю в гугль результаты запроса.
Я думаю ТабДок проще гнать сразу в массив, без ТЗ. И, скорее всего, просто циклами.

Я еще почему с ТЗ заморочился и с массивом "по столбцам", у меня выгружается таблица > 50к строк. Гнать ее вложенными циклами, по моему мнению, менее эффективно, чем через "ВыгрузитьКолонку" хотя я и не тестировал. Но! даты приходится конвертировать в строку после выгрузки колонки. Глупый Гугд не принимает дату в ISO.
34. uno-c 235 09.10.19 18:27 Сейчас в теме
(32)Нехило Вы этак, весь мой авторский код "криптопровайдера" спалили.
ivanovkpd; Cthulhu; +2 Ответить
36. Cthulhu 1 11.10.19 15:21 Сейчас в теме
извините, снова тупые вопросы (пытаюсь пере-до0пилить немного под себя)
1. Проект создан, в "Бибилиотека" подключены API googlesheets и googledrive
2. Учетные параметры выглядят вот так (аттач).
сначала запутался - который json и как выгружать... с горем пополам выгрузил тот, который обработка съела (на другой ругалась).
3. от этой же учетки (в которой создан проект) - создал и сохранил гугль-таблицу. доступ - всем на всё (потом буду экспериментировать с ограничениями, дошло).
4. из джсона - разобрать сертификат - получил для себя мыло (далее использую его).
5. получить токен -
4. для этой гугль-таблицы, с мылом из разобранного сертификата - сгенерировать токен.
5. список листов - получаю запросом с этим токеном+мылом без проблем (с любым токеном, вообще-то - но это наверное из-за полного расшаривания).
6. попытка загнать данные в эту таблицу (на первый лист, с #gid=0) с этими же (своим!) токеном и (своим!) мылом - error 403 "PERMISSION_DENIED".
Прикрепленные файлы:
37. Cthulhu 1 12.10.19 11:24 Сейчас в теме
(36)
прим.: не на токен ругается...
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"status": "PERMISSION_DENIED"
}
}
-- файл создан под тем аккаунтом, в который выполнен вход, и расшарен максимально, на весь инет (редактирование)
а может где-то в консоли какой-нибудь можно посмотреть - кто лез через апи к файлу?
38. uno-c 235 12.10.19 11:44 Сейчас в теме
(37)Думаю, стОит попробовать шаг-в-шаг повторить действия, описанные в статье, т.к. они позволяют редактировать таблицу. А уж потом экспериментировать с доступами "всем на всё" и проч.
40. ivanovkpd 13.10.19 14:36 Сейчас в теме
(38) Ну таки да, я делал, у меня работает :)
Да, еще момент, насколько я понял, учетка в которой живет таблица должна быть для частного лица, иначе все эти АПИ вроде бы платные.
41. Cthulhu 1 15.10.19 09:51 Сейчас в теме
(40)
ааагрррхх... учетка, конечно же (мне ж не для домашней булгахтерии эта вся беда нужна...) - корпоративная.....
42. uno-c 235 15.10.19 10:59 Сейчас в теме
(41)
корпоративная
Cthulhu если есть возможность - отпишитесь пжл., действительно ли дело в корпоративной учетке было. Если на корпоративную таблицу дать доступ емейлу корпоративного сервис-аккаунта - то все равно "PERMISSION_DENIED"?
43. ivanovkpd 15.10.19 11:01 Сейчас в теме
(42) Да, у меня так. я тоже начал с бизнес-учетки.
Потом по итогу просто сделал отдельную "частную".
44. Cthulhu 1 15.10.19 18:43 Сейчас в теме
(42)
отписываюсь.
*** Вошел в личный аккаунт (не корпоративный).
1.1. Создал API-ключ сервисного аккаунта (сохранение json-файла на локал).
1.2. Создал новый гугль-шит, максимально расшарил (доступен всем на все).
2. Запустил обработку (подпиленную, адрес гугль-шита в текстовое поле ввода, e-mail в коде - из поля ввода).
2.1. Выбрал json-файл из п.1.1.
2.2. "Разобрать сертификат", "Получить токен" == "Подпись верна: Да"
2.3. Вбил свой адрес гугль-шита (из п.1.2).
2.4. "Отправить Столбец в гугл" == "Успешно" (и столбец в моем гугл-шите (см.п.1.2) изменился как заказано.
*** Вошел в корпоративный аккаунт.
пп.1.1-2.3, повторил в полном объеме с аналогичными результатами (все Ок).
2.4. "Отправить Столбец в гугл" == { "error": { "code": 403, "message": "The caller does not have permission", "status": "PERMISSION_DENIED" } }
47. ivanovkpd 16.10.19 09:40 Сейчас в теме
(44) Да-да, все точно так. с корпоративной не работает. Денег наверное надо дать. ну или они там дают пробник вроде на год.
39. ivanovkpd 13.10.19 14:34 Сейчас в теме
(36) Я так думаю в настройках доступа к таблице у тебя не указан в явном виде имейл сервис-аккаунта
45. Cthulhu 1 15.10.19 18:56 Сейчас в теме
(39)
я в коде заменил - вместо явного указания он тянется из соответствующего поля ввода (которое пере-вычисляется по "разобрать сертификат").
46. ivanovkpd 16.10.19 09:39 Сейчас в теме
(45) Речь не про код 1С, а про доступ в гугле. У таблицы явно должен быть разрешен доступ томы "мылу", что зашито в JSON, при гнереации сервис-аккаунта
48. Cthulhu 1 16.10.19 23:37 Сейчас в теме
(46)
т.е. ты имеешь ввиду, что по мылу, указанному в json-файле API-ключа сервисного аккаунта - нет доступа к API? по-моему это бред, извини...
49. uno-c 235 17.10.19 00:29 Сейчас в теме
(48)Имелось в виду, что возможно у API особый подход к разрешениям для сервисных аккаунтов - т.е. возможно "все для всех" на них не всегда распространяется, и например, сервисному емейлу обязательно нужно персональное разрешение на редактирование таблицы. Но, судя по Вашему весьма полезному эксперименту в (44) - проблема была исключительно в "корпоративности" учетки.
50. ivanovkpd 17.10.19 07:49 Сейчас в теме
(48) сервисной учетке разрешение на Sheets API дано?
Бред или не бред, но у ТС и у меня работает. Значит, надо где-то у тебя искать. Вот мы и пытаемся нащупать проблему.
51. uno-c 235 17.10.19 08:16 Сейчас в теме
(50)Уже ведь выяснили, что проблема исключительно в корпоративной учетке, Cthulhu специально для этого эксперимент провел (44). Корпоративку ему отбивало "PERMISSION_DENIED", но когда он сделал из личной учетки - то "и столбец в моем гугл-шите (см.п.1.2) изменился как заказано."
52. Cthulhu 1 17.10.19 16:14 Сейчас в теме
(50)
в обеих учетках "api включен" для "google drive" и для "google sheets".
79. olegans 12.01.21 19:28 Сейчас в теме
(36)
Здравствуйте. А каким именно запросом получаете список листов? Что-то не могу разобраться с этим.
54. Ruschel 04.12.19 11:57 Сейчас в теме
Кто-то пробовал использовать данный способ получения токена сервисной УЗ для управления корпоративной почтой(возможно в личной аналогично, не пробовал) через GMail API? Чтобы поменять настройки ящика другому человеку(автоответ и подпись) нужно включить domain-wide делегирование. Не совсем понятно, нужно ли при получении токена указывать адрес юзера в поле стурктуры "sub", которому необходимо изменить настройки? Попытка добавление этого поля в структуру запроса токена выдается ошибка ниже. При этом все scope для сервисного аккаунта выданы и без sub все корректно выдается. Но с таким выданным токеном не удается отредактировать чужие настройки.
{
"error": "unauthorized_client",
"error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."
}
55. uno-c 235 04.12.19 13:31 Сейчас в теме
(54)
https://www.googleapis.com/auth/gmail.settings.sharing Manage sensitive mail settings, including forwarding rules and aliases.

Note:Operations guarded by this scope are restricted to administrative use only. They are only available to G Suite customers using a service account with domain-wide delegation. Restricted
У Вас есть платный G Suite и domain-wide delegation ?
56. Ruschel 04.12.19 13:35 Сейчас в теме
(55)
да, платный GSuite и включенное делегирование в проекте и сервисной УЗ.
Как раз этот scope и API пробую использовать.
57. mad_maksim 87 31.01.20 09:33 Сейчас в теме
Работало без проблем несколько месяцев.
Вчера стало выдавать 401 ошибку.
На всякий случай, создал новый сервисный аккаунт, загрузил JSON. Не помогло.
Нет идей, что могло "сломаться"?
58. uno-c 235 31.01.20 11:40 Сейчас в теме
(57)Да, странно, в заголовках ответ приходит "WWW-Authenticate":"Bearer realm="https://accounts.google.com/", error="invalid_token""
Что получается: Гугл сам прислал этот токен в ответ на запрос токена. Запрос токена был подписан выданным гуглом сертификатом. Но потом Гугл говорит, что токен инвалид. Гугл выдал токен, который Гугл считает "токен инвалид". На первый взгляд - это гугл глючит. Подожду несколько дней, если глюк останется - буду посмотреть.
59. uno-c 235 31.01.20 13:05 Сейчас в теме
(57)Вот, нашел! Я обратил внимание, что длина токена выросла, теперь не хватает даже 200 символов для ее хранения. В моей обработке просто увеличил длину реквизита формы "токен" (сделал неограниченной) - и все снова заработало. Попробуйте у себя то же самое. Саму обработку перезалью на Инфостарт в ближайшее время.
mad_maksim; +1 Ответить
61. mad_maksim 87 31.01.20 13:57 Сейчас в теме
(59)
У меня тоже заработало. Код у меня свой уже, с новой обработкой можно не спешить )
Для истории: по журналу, в течение недели уже были периодические сбои (то работало, то нет)
А со вчера - уже стабильно.
60. mad_maksim 87 31.01.20 13:13 Сейчас в теме
63. malikov_pro 1292 11.07.20 07:43 Сейчас в теме
Допустимо ли Вашу наработку по RS256 добавить к проекту https://github.com/pintov/1c-jwt? Проект присутствует в списке https://jwt.io/
64. uno-c 235 11.07.20 08:57 Сейчас в теме
(63) Думаю, что недопустимо. Это будет довольно странно выглядеть. Моя наработка в три раза длиннее по коду, чем то, что сейчас выложено на гитхабе указанной Вами ссылке. При этом по ссылке внизу написано Author: Vasily Pintov
Т.е. если добавить мою наработку - то получится, что автор Vasily Pintov на самом деле автор только на 25%, а на 75% - не автор )
66. malikov_pro 1292 11.07.20 15:14 Сейчас в теме
(64) (65) Понятно, у автора статья по этому поводу есть ссылка, но RS реализован через внешнюю компоненту, поэтому видимо он на git и не выложил.

"на самом деле автор только на 25%, а на 75% - не автор" - лицензия MIT "Copyright © <год> <владельцы прав>", указываются все разработчики.

"Получится, что мое узкоспециализированное решение" - RS256 не узкоспециализированное решение, на основе HS256 реализовано подключение к zoom ссылка, чтобы найти Вашу реализацию нужно постараться, она реально полезна. Посмотрите на пример компоновки "google-auth-library" которая полностью реализует клиент использует jws (к слову именно этой библиотеки на https://jwt.io/ нет)

"Например, типовые средства винды не позволяют экспортировать ...", проблема прикладных программистов, по части JWT функционал обозначен на скриншоте https://c2n.me/48lSN8V

Понимаю что культура переиспользования кода на уровне плинтуса, давайте посильно улучшать ситуацию.

Ваши наработки буду использовать для google big query, т.к. не силен в криптографии очень помогло.
67. uno-c 235 11.07.20 16:44 Сейчас в теме
(66)
RS256 не узкоспециализированное решение
У меня не решение RS256. У меня "RS256 для случая, когда гугл сгенерировал RSA-ключи, упаковал их в PEM, а далее в json". Не думаю, что кто-то еще провайдеров OAuth так же делает.
69. malikov_pro 1292 11.07.20 19:00 Сейчас в теме
(67) из google-auth-library
const signedJWT = jws.sign({
            header: { alg: 'RS256' },
            payload,
            secret: this.key,
        });

пример с JWT.io уже показал.
Перекомпоную в общий модуль дальше локально использовать буду.
Посмотрите варианты аутентификации https://github.com/vbondarevsky/Connector.

Еще раз благодарю за труд, помогло.
70. uno-c 235 12.07.20 02:46 Сейчас в теме
(69)
пример с JWT.io уже показал.
Пример с JWT.io - это абстрактная реализация алгоритма.
Я имел в виду, что кроме гугла в практике пока нигде не встречал подобного - чтобы сервис-провайдер генерировал и выдавал RSA-ключи. Oauth от Amazon Marketplace, Bitrix24, Opencart, Wordpress, Яндекс, Вконтакте, ... - нигде нет RS256.
Причем для моей реализации нужны именно PEM - ключи. С pkcs (гугл и в таком формате может выдать если попросить) - мой "криптопровайдер" уже не справится )
71. malikov_pro 1292 12.07.20 03:02 Сейчас в теме
(70)
Яндекс
, PS256.
https://cloud.yandex.ru/docs/iam/operations/iam-token/create-for-sa

Пользовался только переводчиком и там допустим API key, но предположу что для части сервисов аутентификация проходит по IAM.
72. uno-c 235 12.07.20 03:25 Сейчас в теме
(71) https://cloud.yandex.ru/docs/iam/operations/iam-token/create-for-sa#via-jwt - да, оказывается не только гугл. Ну если скомпилируете под абстрактный алгоритм не привязанный к гуглу, да еще парсинг PEMа сделаете нормальный через двоичные данные, а не как я через топорную нарезку строки - то конечно пожалуйста. С английским кодом 1С - тоже прикольно )
73. uno-c 235 12.07.20 03:47 Сейчас в теме
(71) Только я вот не помню, смотрел ли стандарт PEM для RSA-ключей (или DER или X.690 - куда там смотреть). Строгая ли там последовательность структуры данных ASN.1. Если нестрогая (что-то может местами меняться) - то на яндексе мой алгоритм разбора ключа может и не сработать. Хотя может в комментах что и оставил про ссылки на стандарты.
А английский код 1С - это супер. Писал как-то http-сервисы бронирования для конфигурации 1С-Отель. Несмотря на то, что авторство 1С, продана российскому отелю - вся конфа на английском написана. Почему-то отошли от своих стандартов https://its.1c.ru/db/v8std#content:456:hdoc
86. uno-c 235 04.03.22 08:48 Сейчас в теме
(71)
(65)
Получится, что мое узкоспециализированное решение будет подано в контексте (как я понял) универсального проекта - т.е. проекта, код которого можно использовать в разных ситуациях без привязки к гуглу.

Сегодня довелось считать RSA-SHA256 подпись ключом доступа для Яндекс.Навигатора.
https://yandex.ru/dev/yandex-apps-launch/navigator/doc/concepts/navigator-commercial-use-signature.html
RSA ключ там короче и в лежит другом месте структуры ASN.1 - пришлось менять алгоритм разбора PEM-ключа. И код алгоритма подписи тоже менять пришлось из-за того, что ключ короче. В общем я был прав, что данная конкретная обработка из этой публикации - не универсальна.
68. uno-c 235 11.07.20 17:26 Сейчас в теме
(66)
чтобы найти Вашу реализацию нужно постараться

https://www.google.ru/search?ie=UTF-8&hl=ru&q=1С%20google%20JWT%20oauth
Когда я забиваю в поиске гугла "1С google JWT oauth" - у меня в выдаче первые четыре ссылки - это моя обработка. Правда самого infostart.ru в ней нет )
65. uno-c 235 11.07.20 09:32 Сейчас в теме
(63) И во-вторых, независимо от авторства, моя наработка имеет узкую направленность - она заточена на json сертификат с закрытым ключом от гугла. Если будет нужно получить такой json сертификат для негугл-ситуации - то это тоже не совсем тривиальная задача. Например, типовые средства винды не позволяют экспортировать сертификат с закрытым ключом в формате BASE64. Получится, что мое узкоспециализированное решение будет подано в контексте (как я понял) универсального проекта - т.е. проекта, код которого можно использовать в разных ситуациях без привязки к гуглу.
74. ksely 112 10.08.20 13:42 Сейчас в теме
У меня СОМ объект "System.Security.Cryptography.RSACryptoServiceProvider" прекрасно работает в файловом варианте. А при вызове через IIS выдает "Error calling context method (SignHash)". Эксперименты показали, что методы класса RSA работают, а RSACryptoServiceProvider - нет. Похоже, что пользователю, под которым работает радочий процесс IIS, не хватает каких-то прав... Никто не сталкивался?
75. uno-c 235 10.08.20 14:19 Сейчас в теме
(74) Попробуйте IIS временно под админом запустить, чтобы прав по максимуму было. Если сработает - то можно будет дальше ковырять, каких там прав не хватает.
76. ksely 112 10.08.20 17:55 Сейчас в теме
(75) У меня, к сожалению, не особо много времени на эксепименты есть...
Но у меня заработал код из Вашей обработки, который без СОМ объекта. За что Вам Огромное Человеческое Спасибо!!! )))
77. user631502_m.parakhina 17.12.20 17:36 Сейчас в теме
Добрый день. На платформе 8.3.16 и выше Ваш функционал будет работать?
78. uno-c 235 17.12.20 18:33 Сейчас в теме
(77) Здравствуйте. Под рукой 1С:Предприятие 8.3 (8.3.17.1496) - на ней сейчас проверил, работает.
80. user699502_rus.ah7435sn 02.02.22 15:34 Сейчас в теме
Добрый день, Разработчик.
скачал обработку.
и читая описание:
"Для получения токенов на api spreadsheets от имени Вашего сервис-аккаунта, необходимо в консоли разработчика https://console.developers.google.com создать/скачать JSON-ключ сервисного аккаунта с доступом к api spreadsheets, и указать его в поле обработки "Путь файла ключа json"."

Не нашел в обработке "Путь файла ключа json". Где он?
82. uno-c 235 03.02.22 03:31 Сейчас в теме
(80) Здравствуйте! Обработку из моей публикации Вы не скачивали.
Прикрепленные файлы:
84. user699502_rus.ah7435sn 03.02.22 08:14 Сейчас в теме
(82)

Добрый день.
Чтобы не засорять форум, написал Вам в личку.
81. user699502_rus.ah7435sn 02.02.22 15:34 Сейчас в теме
подскажите где получить client_secret?
83. uno-c 235 03.02.22 03:32 Сейчас в теме
(81)
client_secret
В обработке из этой публикации client_secret не используется.
87. Uncore 1272 18.09.22 16:49 Сейчас в теме
(83)Добрый день. Есть запрос на доработку, как можно с Вами связаться? Личные сообщение что-то перестали отправляться.
88. uno-c 235 18.09.22 17:19 Сейчас в теме
(87) Здравствуйте. Вроде написал Вам в личку.
85. volga-autom 03.03.22 13:05 Сейчас в теме
Здравствуйте! Есть ли возможность подписи строки для яндекс навигатора? Ключем pem
Есть желание и возможность реализовать этот механизм?
89. ishbulatova68 10.11.22 11:24 Сейчас в теме
Здравствуйте!Не сталкивались ,как получить подпись sha1rsa,если есть 2 файла public.key и private.key
90. uno-c 235 10.11.22 11:54 Сейчас в теме
(89) Здравствуйте! Насколько помню, sha1rsa может и МенеджерКриптографии сделать подпись. Нужно конвертировать эти ключи в формат, который МенеджерКриптографии понимает, и скормить ему. Конвертировал я когда-то openssl -ом.
91. ishbulatova68 10.11.22 14:31 Сейчас в теме
"конвертировать эти ключи в формат, который МенеджерКриптографии понимает" как раз этого мы и не нашли,вроде как из 2-ух файлов .key нельзя, или мы не знаем как
92. uno-c 235 10.11.22 15:02 Сейчас в теме
(91) Давно это делал, но вроде все получалось, работало.
93. pan_alex 06.01.23 12:42 Сейчас в теме
Добрый день!
Поставили мне задачу по работе с Google Calendar.
Все случилось, но уперся в обновление токенов. Решил перейти с клиентского ID на сервисный аккаунт. Поиск, как вы заметили, выдает только Ваши наработки.
При ручном формировании токена JWT с помощью online-encoder'а - все прекрасно, но хотелось бы автоматизировать процесс.
Как можно связаться с Вами для обсуждения? Личные сообщения мне, как неактивному пользователю "Инфостарт". недоступны.
Оставьте свое сообщение