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
78 Скачать бесплатно
Google Spreadsheet и JWT ТокенДоступа (нативная реализация, только 1С 8.3.21 с использованием srvice account):
.cfe 12,13Kb
69 Скачать бесплатно

Задача: Требуется загрузка табличного документа в 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С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

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

36000 руб.

03.08.2020    22045    32    24    

26

SALE! 15%

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

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

17280 14688 руб.

20.12.2024    4253    21    3    

21

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    9636    7    5    

11

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

Обмен данными с "Порталом поставщиков" zakupki.mos.ru Москвы и Московской области с целью создания оферт для закупок государственными учреждениями. Модуль устраняет рутину, минимизирует ошибки и помогает выигрывать больше закупок. Работает строго по требованиям 44-ФЗ.

14400 руб.

13.12.2016    41598    54    39    

37

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

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

12000 руб.

02.02.2021    20825    60    52    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bayselonarrend 2956 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 Сейчас в теме
спасибо автору помогло очень!
Для отправки сообщения требуется регистрация/авторизация