Google Spreadsheet и JWT ТокенДоступа (нативная реализация, только 1С 8.3.21 с использованием service account)

14.04.24

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

Реализация работы с google таблицами, сервисным аккаунтом, типовыми методами 1С 8.3.21.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Google Spreadsheet и JWT ТокенДоступа (нативная реализация, только 1С 8.3.21 с использованием srvice account):
.epf 7,54Kb
87 Скачать бесплатно
Google Spreadsheet и JWT ТокенДоступа (нативная реализация, только 1С 8.3.21 с использованием srvice account):
.cfe 12,13Kb
75 Скачать бесплатно

Задача: Требуется загрузка табличного документа в google таблицу. Также желательно иметь возможность получить google таблицу прямо в 1С.

Условие: без использования сторонних библиотек.

У "google sheet" имеется достаточно развитая API. С ней как бы проблем нет, стандартный REST API.

Почитав русскоязычные источники, выяснилось, что основная проблема это авторизация в google api средствами JWT. До платформы 8.3.21 - это было действительно проблемой, так как в 1С отсутствовала поддержка подписания токена алгоритмом sha256.

С выходом платформы 8.3.21, в 1С появился новый объект ТокенДоступа (AccessToken), его мы и будем использовать в решении данной задачи.

Описывать создание сервисного аккаунта не буду. Есть много видео по этой теме. В результате у вас должен быть в наличии JSON файл сервисного пользователя с правами на "Google Sheets API".

 

Разберем создание JWT токена:

Функция ПолучитьJWTТокен()
	ТокенДоступа = Новый ТокенДоступа;
	
	//Алгоритм шифования
	//Google API использует алгоритм "RS256"
	ТокенДоступа.Заголовки.Вставить("alg", "RS256");
	//Формат токена
	//Google API использует формат "JWT"
	ТокенДоступа.Заголовки.Вставить("typ", "JWT");
	
	//iss - Адрес электронной почты service account
	//Данный параметр находится в JSON файле, в свойстве "client_email"
	ТокенДоступа.Эмитент = "test@test-11.iam.gserviceaccount.com";
	
	//scope - Список областей, разделенных пробелами, которые определяют ресурсы,
	//к которым ваше приложение может получить доступ от имени пользователя.
	//Для работы с google таблицами нам хватит двух:
	//"https://www.googleapis.com/auth/spreadsheets"
	//"https://www.googleapis.com/auth/drive"
	ТокенДоступа.ПолезнаяНагрузка.Вставить("scope", "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive");
	
	//aud - A descriptor of the intended target of the assertion
	// или дескриптор предполагаемой цели утверждения.
	//Данный параметр находится в JSON файле, в свойстве "token_uri"
	//И на текущий момент всегда равен "https://oauth2.googleapis.com/token"
	ТокенДоступа.ПолезнаяНагрузка.Вставить("aud", "https://oauth2.googleapis.com/token");
	
	//Дополнительно нам нужно указать 2 параметра
	//что бы задать время жизни токена
	
	//Первый iat - Числовое значение времени создания токена доступа в формате UnixTime
	ТокенДоступа.ВремяСоздания = ТекущаяУниверсальнаяДата() - Дата(1970,1,1,0,0,0);
	//Второй exp - Числовое значение времени истечения срока действия токена
	//в формате UnixTime. Максимум 1час после iat.
	//Вычисляется как iat + 1час
	ТокенДоступа.ВремяЖизни = ТокенДоступа.ВремяСоздания + 60 * 60;             
	//Тут вроде всё хорошо, но 1С упорно, не верно вычисляет время exp
	//По этому мы переопределим данный параметр через полезную нагрузку.
	ТокенДоступа.ПолезнаяНагрузка.Вставить("exp", Формат(ТокенДоступа.ВремяЖизни, "ЧГ="));
	
	//JWT - Последняя часть формирования токена - это создание подписи.
	//Для подписи нам потребуется ключ в формате PEM
	//взять его можно так же из файла JSON, в свойстве "private_key"
	ТокенДоступа.Подписать(АлгоритмПодписиТокенаДоступа.RS256, "-----BEGIN PRIVATE KEY-----
	|MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7VJTUt9Us8cKj
	|................................................................
	|dn/RsYEONbwQSjIfMPkvxF+8HQ==
	|-----END PRIVATE KEY-----");
	
	//Сам JWT токен, это сроковое представление объекта ТокенДоступа
	Возврат Строка(ТокенДоступа);	
КонецФункции

 

Запрос получения токена доступа:

Функция ПолучитьНовыйТокен(Знач Токен)
	//Создаем заголовки для запроса
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");	
	
	//Формируем строку запроса
	//основной параметр тут "grant_type"
	//на данный момент он имеет статичное значение
	//"urn:ietf:params:oauth:grant-type:jwt-bearer"
	grant_type = КодироватьСтроку("urn:ietf:params:oauth:grant-type:jwt-bearer", СпособКодированияСтроки.КодировкаURL);	
	ПараметрыЗапроса = СтрШаблон("grant_type=%1&assertion=%2", grant_type, Токен);	
	ЗапросТекст = СтрШаблон("/token?%1", ПараметрыЗапроса);
	
	//Отправляем POST запрос с нашим токеном в качестве параметра.
	Соединение = Новый HTTPСоединение("oauth2.googleapis.com", 443,,,, 30, Новый ЗащищенноеСоединениеOpenSSL);
	HTTPЗапрос = Новый HTTPЗапрос(ЗапросТекст, Заголовки);
	Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);	
	
	//И получаем "access_token"
	//используемый для дальнейшей работы с google api
	Если Результат.КодСостояния = 200 Тогда
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.ОткрытьПоток(Результат.ПолучитьТелоКакПоток());
		Возврат ПрочитатьJSON(ЧтениеJSON, Истина).Получить("access_token");
	КонецЕсли;	                                           
	Возврат Неопределено;
КонецФункции

 

Вступайте в нашу телеграмм-группу Инфостарт

Google spreadsheets sheets JWT ТокенДоступа 8.3.21

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

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

42700 руб.

03.08.2020    23136    33    24    

26

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    5194    22    4    

24

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    41075    75    45    

31

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Расширение для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

24000 руб.

02.02.2021    21737    62    52    

40

WEB-интеграция Загрузка и выгрузка в Excel Программист Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Расширение освободит вас от необходимости вручную обновлять товары в группах ВКонтакте. Достаточно задать правила один раз, и система автоматически синхронизирует ваш каталог. Вы сможете легко выбирать, какие товары публиковать, создавая гибкие критерии отбора. Например, можно добавить важные для покупателей параметры: цвет, размер или другие характеристики.

12200 руб.

29.08.2025    1522    2    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bayselonarrend 3008 15.04.24 06:45 Сейчас в теме
Хорошо, что нечто подобное появилось

в 1С отсутствовала поддержка подписания токена алгоритмом sha256


Это не совсем так. Проблема была в rs256. В простом использовании SHA256 или том же более распространенном, чем rs256, hs256 (HMAC) никакой проблемы не было
user2024991; +1 Ответить
2. hrom 69 05.06.24 10:34 Сейчас в теме
Платформа 8.3.20. Режим совместимости отключен

Тип не определен (ТокенДоступа)
ТокенДоступа = Новый <<?>>ТокенДоступа;
3. wolfery 09.04.25 11:48 Сейчас в теме
Из синтаксис-помощника:
ВремяЖизни
Определяет время жизни токена в секундах. Устанавливает значение для ключа 'exp' равное сумме времени создания и времени жизни.

То есть надо указывать просто 60*60, тогда exp будет правильно вычисляться.

Спасибо за статью. Была ошибка получения токена по jwt "Invalid oauth scope or ID token audience provided.". Оказалось что параметр ПолезнаяНагрузка нельзя перезаписывать другим соответствием, какие-то предзаполненные данные там, видимо, есть.
4. Power_0N 49 31.05.25 14:08 Сейчас в теме
А как связаны между собой 2 эти функции?
5. Power_0N 49 31.05.25 16:26 Сейчас в теме
(4)
Ок, вроде понял, что Токен JWT передаётся потом в ПолучитьНовыйТокен() , что по названию функции вообще не очевидно =))
А как используется потом access_token ?
6. Romyl01 38 08.07.25 09:54 Сейчас в теме
спасибо автору помогло очень!
Для отправки сообщения требуется регистрация/авторизация