«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание действующего набора утверждений JWT.

Создание действующего набора утверждений JWT.

Опубликовано 4 ноября 2024 г.
Просматривать:935

Building a valid JWT Claims Set

Введение

Мне нужно было просмотреть запрос на включение, который исправлял обнаруженную проблему с образцом, и пока тесты проходили, у меня возникло ощущение, что с образцом должно происходить что-то еще, что нужно изменить.

Я уже давно знаю о веб-токенах JSON (JWT произносится как «йоты»), но не знаю их. Просмотр этого пиара дал мне повод углубиться в их изучение.

Что такое JWT

JWT — это открытый стандартный метод безопасной передачи информации между сторонами. Они часто используются для аутентификации пользователей и авторизации доступа к ресурсам. Они состоят из трех частей: заголовка, полезных данных и подписи.

Зачем вам нужны JWT

API учетных данных службы IAM создает кратковременные учетные данные для выдачи себя за учетные записи службы IAM. Метод SignJwt подпишет JWT, используя закрытый ключ учетной записи службы, управляемый системой. В теле запроса метода SignJwt поле полезных данных должно содержать сериализованный объект JSON, содержащий набор утверждений JWT.

Что такое претензии 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
}

Этот набор претензий включает следующие поля:

  • iss: эмитент JWT, учетная запись службы, которая будет аутентифицироваться, в этом случае должен быть адрес электронной почты учетной записи службы.
  • sub: Тема пользователя JWT, которая представляет собой адрес электронной почты сервисной учетной записи.
  • aud: аудитория JWT, которая представляет собой URL-адрес ресурса, защищенного IAP.
  • iat: время выдачи, то есть время создания JWT. Это должно быть целое число в формате UTC.
  • exp: время истечения срока действия, то есть время, когда JWT перестанет быть действительным. Существуют дополнительные ограничения, которые документирует Cloud IAM: это не может быть в прошлом и не более чем на 12 часов в будущем.

Включив эти утверждения в полезную нагрузку вашего 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,
        }
    )

Полный (обновленный!) код для этого примера можно найти здесь.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3