Как правильно подписать Json веб-токен с помощью учетных данных моей учетной записи службы Google Cloud Platform JSON (без библиотек Google) в C#? - PullRequest
0 голосов
/ 28 января 2020

Я знаю, что API-интерфейсы REST часто используются и очень важны для веба, но в основном я когда-либо делал только автономные приложения для настольных компьютеров (подумайте, разработчик однопользовательской игры). В последнее время я провел много исследований и нашел концепцию REST простой, но мой текущий проект - мой первый раз, когда я использую REST API или криптографию в любом значимом качестве. Поэтому, если я скажу что-нибудь глупое, пожалуйста, потерпите меня.

В моем текущем проекте я пытаюсь отправить электронное письмо из моего приложения Unity3D с помощью API GEST REST Google Cloud Platform (GCP). Я обнаружил в своей первоначальной реализации с использованием клиентских библиотек Google (которые они рекомендуют использовать разработчикам - и не без причины), что клиентские библиотеки Google создают искаженные REST-запросы при использовании в контексте Unity3D (почему это остается TBD).

В результате я пытаюсь выполнить все свое взаимодействие с GCP с помощью необработанных запросов REST (через HTTP). Я создал Json веб-токен, как указано здесь (лучшая ссылка, которую я нашел).

Токен имеет заголовок (как описано в статье выше) и Исковые требования установлены (также в статье). Мне также удалось сгенерировать подпись, но я почти уверен, что моя подпись неверна - потому что я создаю подпись, никогда не загружая учетные данные своей учетной записи службы из файла учетных данных JSON, который я загрузил с панели управления GCP .

Мой главный вопрос «Как мне это сделать»:

Подпишите представление UTF-8 для ввода с помощью SHA256withRSA (также известного как RSASSA-PKCS1-V1_5-SIGN с функцией SHA-256 ha sh) с закрытым ключом, полученным из консоли API Google. Выходными данными будет байтовый массив.

in C#? В настоящее время у меня есть представление UTF-8, хранящееся в виде байта [] с именем «InputBuffer», но мне очень трудно понять, как подписать InputBuffer с помощью закрытого ключа. Может ли кто-нибудь дать пример с объяснением? или предоставить ссылку на такое? (Я думаю, что я нашел одну ссылку во всем моем поиске, но забыл добавить ее в закладки и в итоге потерял ее. (Правка: нашел ее здесь , хотя это пример Python, использующий jwt.encode, Я пытаюсь преднамеренно изобретать колесо здесь, в C#, чтобы обойти ошибки Библиотеки Google, поскольку Unity не является поддерживаемой платформой.)

В какой форме мне нужно получить закрытый ключ ? Byte []? String? ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это для производственного проекта, поэтому мне нужно убедиться, что я правильно понимаю и что моя реализация безопасна. Какие ошибки мне следует остерегаться?

РЕДАКТИРОВАТЬ: Найдено этот вопрос SO , который, по сути, заключает в себе то, что я пытаюсь сделать, однако SOUser Hans. Z указывает, что он уязвим для атаки безопасности. Я пытаюсь сделать то же самое, что и автор предыдущего вопроса , но делай это правильно.

...