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

Обмен - Интеграция с WEB

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

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

Пока в интернете я встречал только описание использования из 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).

9

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

Наименование Файл Версия Размер
(8.3.10 и 8.3.11) Авторизация OAuth 2.0 в API Google и получение access token для сервисной учетной записи, не требует подтверждения пользователя:
.epf 20,47Kb
17.07.18
18
.epf 1.0 20,47Kb 18 Скачать
(8.3.9) Авторизация OAuth 2.0 в API Google и получение access token для сервисной учетной записи, не требует подтверждения пользователя:
.epf 21,03Kb
17.07.18
0
.epf 1.0 21,03Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
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 33 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 33 13.07.18 10:54 Сейчас в теме
Отлично!

Конечно же, важно не путать методы HTTPСоединение (HTTPConnection):
Записать (Put)
ОтправитьДляОбработки (Post)
Получить (Get)
6. kasper076 19 28.11.18 15:45 Сейчас в теме
Реально работает. Спасибо.
7. kasper076 19 29.11.18 10:15 Сейчас в теме
В данном примере сертификат содержится в файле формата JSON. А если сертификат в файле cer, как тогда можно достать закрытый ключ?
8. uno-c 33 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 19 30.11.18 10:00 Сейчас в теме
(8) Некорректно сформулировал свой вопрос. Вот тут ты используешь COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider") для подписи файла по алгоритму RSA-sha256. А в обработке из этой темы СОМ-объект не используется. Возможно ли только средствами 1С подписать и поверить подпись RSA-sha256, если сертификат лежит в файле cer?
10. uno-c 33 30.11.18 11:42 Сейчас в теме
(9)Если закрытый ключ содержится в файле - думаю можно, т.к. у эски есть инструменты для работы с двоичными данными. Но повторю, в .cer как правило нет закрытого ключа, нужен .pfx или .p12.
11. kasper076 19 30.11.18 11:56 Сейчас в теме
(10) pfx тоже есть. Но при экспорте из хранилища сертификатов был запрошен ввод пароля. На Хабре прочитал, что это дополнительная защита закрытого ключа, сам файл pfx шифруется с помощью этого пароля.
Я попробовал разобрать файл cer используя алгоритм из обработки. Но результат получился не корректным. Получились классы не входящие в формат ASN.1
Прикрепленные файлы:
12. uno-c 33 30.11.18 13:03 Сейчас в теме
(11)Шифруется потому что содержит закрытый ключ. Значит, если сильно хочется эской - нужно разбирать и расшифровывать ). Посмотрел пару закрытых ключей в pfx - они зашифрованы 3DES SHA-1. Но это совсем для 1с-гурманов ). Менеджер криптографии вроде только с асимметричным шифрованием работает, т.е. придется алгоритм расшифровки вручную прописывать, если хочется без COM или Native.
13. kasper076 19 30.11.18 13:28 Сейчас в теме
(12) Ну мы не такие :-) . Решили прост отказаться от RSA-sha256. Нам нельзя использовать сторонние библиотеки.
14. uno-c 33 30.11.18 14:22 Сейчас в теме
(13)Да, средствами эски расшифровывать закрытый ключ из pfx неоправданно трудоемко будет. Разве что для какой-нибудь дипломной работы - из теоретического интереса решить задачку.
Оставьте свое сообщение