Мне нужно было просмотреть запрос на включение, который исправлял обнаруженную проблему с образцом, и пока тесты проходили, у меня возникло ощущение, что с образцом должно происходить что-то еще, что нужно изменить.
Я уже давно знаю о веб-токенах JSON (JWT произносится как «йоты»), но не знаю их. Просмотр этого пиара дал мне повод углубиться в их изучение.
JWT — это открытый стандартный метод безопасной передачи информации между сторонами. Они часто используются для аутентификации пользователей и авторизации доступа к ресурсам. Они состоят из трех частей: заголовка, полезных данных и подписи.
API учетных данных службы IAM создает кратковременные учетные данные для выдачи себя за учетные записи службы IAM. Метод SignJwt подпишет JWT, используя закрытый ключ учетной записи службы, управляемый системой. В теле запроса метода SignJwt поле полезных данных должно содержать сериализованный объект JSON, содержащий набор утверждений JWT.
Утверждения — это основная информация, которую передает JWT.
Вот пример допустимого набора утверждений:
{ "iss": "https://cloud.google.com/iam", "sub": "projects/-/serviceAccounts/[email protected]", "aud": "https://my-iap-protected-app.example.com", "iat": 1694003600, "exp": 1694007200 }
Этот набор претензий включает следующие поля:
Включив эти утверждения в полезную нагрузку вашего JWT, вы можете гарантировать, что он действителен и может использоваться для доступа к ресурсам, защищенным IAP.
Исходный код выглядел так:
iat = datetime.datetime.now(tz=datetime.timezone.utc) exp = iat 3600 return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": iat, "exp": exp, } )
Я знаю, что с тестированием что-то не так, но я не хочу блокировать решение основной проблемы с этим кодом.
Автор PR внес изменение
iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
Казалось, это неполное решение. Основываясь на документации API, я понял, что представленное исправление все равно не будет устанавливать для iat тип int и все равно не будет работать. Я предложил небольшое изменение, которое решило бы проблему PR с
now_utc = datetime.datetime.now(tz=datetime.timezone.utc) iat = int(now_utc.timestamp())
Чем больше я об этом думал, тем больше понимал, что Datetime бесполезен для этого примера. Модуль Datetime предоставляет классы для управления датами и временем, которые полезны, когда вам нужны даты. Нам буквально нужно целое число в формате UTC, чтобы модуль Time был более полезным.
Insetad, мы можем это сделать
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now 3600, } )
Полный (обновленный!) код для этого примера можно найти здесь.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3