CloudFront с аутентификацией JWT

В этой заметке я расскажу, как CloudFront предоставляет аутентификацию JWT, которую я успешно применил в проекте. Надеюсь, это будет полезно для вас.

1. Требования:
Мой клиент предоставляет LMS (систему управления обучением) для языкового обучения на AWS. Их клиенты должны купить учебный курс, чтобы учиться по записанным видео (Video on Demand). Видео хранятся в ведре S3 в качестве источника. После успешного входа клиента на веб-портал он получит JWT (JSON Web Token) от webapp, а затем использует токен для получения видео из origin через CloudFront.

2. Решение:
CloudFront аутентифицирует с помощью CloudFront Function JWT клиента и затем выполняет следующие действия:

  • Если токен действителен или срок его действия не истек, дистрибутив CloudFront проверяет свой кэш. В случае попадания в кэш CloudFront Edge доставляет видео клиенту. В противном случае CloudFront distribution запрашивает источник (ведро S3) для видео.
  • Если токен недействителен, или истек срок действия, или токен не включен в запрос клиента, CloudFront Edge отправляет клиенту ответ с кодом ошибки 401 (Unauthorized).

Ниже показана концепция решения:

Компонентами являются:

  • CloudFront: CloudFront Functions выполняет исходный код аутентификации JWT. Ведро S3, в котором хранятся обучающие видео, будет являться источником распространения CloudFront с идентификатором доступа Origin Access Identity (OAI) для ограничения доступа к ведру только через CloudFront.
  • Ведро S3: хранение обучающих видео. Политика ведра S3 должна быть настроена таким образом, чтобы разрешить доступ к ведру только дистрибутиву CloudFront.

3. Введение в CloudFront и функции CloudFront:
3.1. CloudFront:
CloudFront — это AWS CDN (сеть доставки контента), надежно доставляющая контент с низкой задержкой и высокой скоростью передачи. Она состоит из глобальной сети CloudFront Edge, распределенных по всему миру и использующих по умолчанию AWS Shield Standard для защиты от DDoS-атак без дополнительной платы. Пожалуйста, ознакомьтесь с дополнительной информацией ниже:

  • Официальный документ CloudFront
  • Информация об инфраструктуре CloudFront

3.2. Функции CloudFront:
Функции CloudFront идеально подходят для выполнения легких вычислительных задач в веб-запросах. Некоторые популярные случаи использования:

  • Работа с заголовками HTTP: Просмотр, добавление, изменение или удаление любых заголовков запроса или ответа. Например, добавление заголовков HTTP Strict Transport Security (HSTS) в ответ или копирование IP-адреса клиента в новый заголовок HTTP (например, True-Client-IP) для пересылки этого IP-адреса в источник запроса.

  • Переписывание и перенаправление URL-адресов : Генерируйте ответ из функций CloudFront для перенаправления запросов на другой URL. Например, перенаправить не прошедшего аутентификацию пользователя с запрещенной страницы на платную. Вы также можете использовать переписывание URL для A/B тестирования сайта.

  • Работа с ключами кэша и нормализация: преобразование атрибутов HTTP-запроса (URL, заголовки, cookies, строки запроса) для создания ключа кэша CloudFront, который используется для определения попаданий в кэш при последующих запросах. Преобразуя атрибуты запроса, вы можете нормализовать несколько запросов к одному ключу кэша, что приведет к улучшению коэффициента попадания в кэш.

  • Авторизация доступа: Реализуйте контроль доступа и авторизацию для контента, доставляемого через CloudFront, путем создания и проверки пользовательских токенов, таких как HMAC-токены или JSON web-токены (JWT), для разрешения или запрета запросов.

На момент написания этой статьи CloudFront Functions поддерживает только JavaScript. Для получения дополнительной информации, пожалуйста, обратитесь к ссылке.

Я сослался на этот репозиторий AWS GitHub для исходного кода аутентификации JWT. Вы можете написать подход к аутентификации JWT самостоятельно. Это зависит от вас!

Вот некоторые конфигурации в CloudFront:

a) Функции CloudFront после публикации в живом развертывании:

CloudFront Functions написаны на JavaScript для аутентификации клиентского запроса со строковым параметром JWT. Она декодирует значение JWT, используя предварительно определенный ключ (в моем случае это секретный ключ AWS). Если значение JWT успешно подтверждено функциями CloudFront или не прошло время истечения срока действия, запрос клиента будет обработан. В противном случае клиенту будет отправлено ответное сообщение «401 — Unauthorized».

Функцию CloudFront можно также опубликовать в среде разработки для тестирования. Пожалуйста, помните, что только в производственной среде функция будет связана с дистрибутивом CloudFront.

б) В моем случае запрос клиента содержит значение JWT в параметре строки запроса с именем jwt. Политика кэширования CloudFront должна быть сконфигурирована с настройкой ключа кэширования следующим образом:

Примечание: значение строки запроса может быть другим в вашем случае. Это зависит от строки параметра, которая определена в коде бэкенда. В некоторых случаях строка параметров имеет вид «token=xxxyyyzzz». Таким образом, значение строки запроса должно быть «token».

c) После создания CloudFront Functions, она должна быть интегрирована с поведением CloudFront, чтобы функция использовалась:

Примечание: Функции CloudFront могут быть интегрированы с запросом Viewer и ответом Viewer. Для запроса Origin и ответа Origin можно интегрировать только Lamda@Edge.

После выполнения вышеуказанных шагов я протестировал функцию в приложении Postman, прежде чем применить ее в проекте. Видео было загружено в ведро S3 (origin). API-запрос с действительным параметром JWT-строки был передан из аутентификации CloudFront и получил ответ от CloudFront. В противном случае в ответ было отправлено сообщение «401 — Unauthorized». Вот результат:

API с действительным строковым параметром JWT. Код ответа — 200 OK.

Запрос API без строки параметра JWT. Код ответа — 401 Unauthorized.

4.Заключение:

В этом посте я показал, как CloudFront может аутентифицировать JWT из клиентского запроса для обслуживания видео, хранящегося в ведре S3. Это решение может быть полезным для тех, у кого есть VoD приложение.

P/s: В документе AWS также содержится руководство по хостингу потокового видео по требованию с помощью S3, CloudFront и Route 53. Если вас заинтересовал этот сценарий, пожалуйста, обратитесь к этой ссылке.

Спасибо за прочтение! С нетерпением жду ваших комментариев!

Оцените статью
devanswers.ru
Добавить комментарий