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

1. Требование:
Мой клиент предоставляет LMS (Learning Management System) для языкового обучения на AWS. Их клиенты должны купить обучающий курс, чтобы учиться на записанных видео (видео по запросу). Видео хранятся в корзине S3 в качестве источника. После того, как клиент успешно войдет на веб-портал, он получит JWT (веб-токен JSON) из веб-приложения, а затем используйте токен для получения видео из источника через CloudFront.

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

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

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

CloudFront с S3

Компоненты:

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

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

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

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

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

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

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

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

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

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

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

Описание изображения

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

Описание изображения

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

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

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

Примечание: Функции CloudFront можно интегрировать с запросом средства просмотра и ответом средства просмотра. Только для запроса Origin и ответа Origin Ламда@Эдж могут быть интегрированы.

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

Описание изображения

API с допустимой строкой параметра JWT. Код ответа был 200 ОК.

Описание изображения

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

4. Вывод:

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

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

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