Вводные
- Нужно получить токен доступа к сервисам google для сервисного пользователя
- Для аутентификации используется JWT c RS256 (SHA256RSA)
- Для получения токена возможно использовать форматы ключей
- p12 с предопределенным паролем
- PEM в составе JSON
- Сервер 1С на windows
Реализация
При реализации использовал наработки:
- по RSA и JWT uno-c //infostart.ru/public/805071/
- по HTTP клиенту vbondarevsky //infostart.ru/public/709325/
Документация аутентификации ссылка
В 1С не реализован механизм RSA, используются:
- "МенеджерКриптографии()", как в него поместить ключ из файла или из строки не понял
- COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider"), он работает с ключом в формате XML
- нативная реализация от uno-c, не стал использовать "в лоб", т.к. автор написал что разбор PEM не оптимален и заточен только под формат google, так же не получилось сопоставить XML формат и результат его разбора формата PEM.
В windows есть подсистема "System.Security.Cryptography" которая умеет работать с SHA256RSA (документация), для работы использует формат XML, который можно получить из ключа p12 используя system.security.cryptography.x509certificates (документация). Пример скрипта конвертации PowerShell взял у uno-c, перенес в код ПолучитьЗапуститьСкриптКонвертации(), конвертировать из PEM используя PowerShell у меня не получилось, ломается на ошибке импорта из массива байт, если тема интересна могу код скрипта в комментариях разместить.
Реализовал в виде расширения
- Основной функционал в общем модуле "auth_g_Сервер".
- Данные по пользователям храню в спр. "auth_g_СервисныеПользователи"
- Полученные токены храню в РС auth_g_Токены
В форме спр. "auth_g_СервисныеПользователи" реализовал
- обращение к файлу p12 и передачу данных для конвертации в XML
- получение PEM ключей из файла JSON
- обращение для получения токена с выбранными правами доступа
- проверку через получение информации о токене и списку ролей (для доступа нужно на уровне консоли включить API для AIM)
Исходный код на GitHub (ссылка).
Для linux серверов рассматривал обращение к node.js сервису с HTTP сервисом и использованием библиотеки jsonwebtoken.
Тестировалось на БСП 3.1.2 (режим совместимости 8.3.14)
Благодарю за внимание.