Всем привет,

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

Во всяком случае, на моей работе SRE в качестве консультанта Generali Investments нам нужно было разработать собственный авторизатор для нашей прекрасной облачной платформы данных на базе AWS и Python, чтобы заменить авторизатор Cognito, который не покрывает то, что нам нужно.

Авторизатор Lambda полезен, если вы хотите реализовать пользовательскую схему авторизации, в которой используется стратегия аутентификации токена-носителя, такая как OAuth или SAML, или в которой используются параметры запроса для определения личности вызывающего абонента.

В Интернете есть множество похожих способов реализации Lambda Authorizer, но ни один из них не подходил для нашего варианта использования. Наши API расположены на API Gateway, они отправляют REST-запросы с полезной нагрузкой GraphQL в Appsync, передавая некоторые настраиваемые заголовки, которые вызывают целевую лямбда-функцию для выполнения некоторых foo() и bar(). С помощью пользовательских заголовков, передаваемых вниз по течению, мы выполняем некоторые специфические операции безопасности (в основном безопасность на уровне строк).

Поэтому я пишу эту статью, чтобы помочь вам, юные падаваны, добиться цели.

Архитектура высокого уровня

Вот вам и простая, но причудливая архитектура. Взаимодействия следующие:

  • Клиент (в моем случае наше веб-приложение) отправляет запрос GET с токеном авторизации, который содержит токен JWT.
  • Запрос направляется прямо в конечную точку шлюза API, останавливаясь на пользовательском авторизаторе.

Authorizer, пользовательская лямбда-функция, написанная на Python:

  • декодирует токен jwt (непроверенные утверждения);
  • проверяет утверждения токена;
  • регистрирует некоторые основные данные о запросе авторизации в CloudWatch.
  • отвечает встроенной политикой do Разрешить/запретить «вызов:» ресурса.

Если разрешено, вызывается конечная точка AppSync, которая вызывает целевую лямбда-выражение в качестве источника данных.

Формат токена JWT

К вашему сведению, это структура токена JWT. Справа некоторые атрибуты, такие как «exp», «iss», «token_use», будут использоваться для проверки утверждений токена с помощью пользовательского авторизатора.

Шлюз API

Авторизатор

Прежде всего, вам нужно создать авторизатор на шлюзе API для вашего API. Вы можете сделать это, нажав на боковую панель и перейдя на вкладку Авторизатор.

Заполните его следующей информацией и, конечно же, настройте его для своей установки. Небольшое примечание, если это недостаточно ясно для некоторых из вас: в разделе Лямбда-функция вам нужно выбрать пользовательскую лямбда-функцию авторизатора, которая будет лямбдой, которая обрабатывает часть авторизации рабочего процесса. Так что, если у вас его нет, создайте его!

Теперь вы можете протестировать (на самом деле нет) ваш авторизатор, нажав «Тест». Прежде чем сделать это, вам нужно закодировать вашу лямбда-функцию.

После вставки токена JWT ответ должен быть примерно таким:

Как видите, это встроенная политика, которая дает разрешение на вызов Landing Lambda Function.

Синхронизация приложений

Настройте запрос REST для связи с AppSync следующим образом. Вы можете выбрать поле поддомена AWS из API AppSync.

В разделе «Заголовки HTTP» вставьте все заголовки, которые необходимо передать нижестоящим лямбда-функциям.

AWS Lambda: настраиваемый авторизатор

Все идет нормально. Я уже чувствую запах успеха. Теперь самое интересное, код нашего пользовательского авторизатора.

Код разделен на две части:

  • main.py будет обрабатывать общий рабочий процесс лямбда-выражения.
  • jwt_verifier.py выполнит проверку токена jwt. Эта часть кода была взята из репозитория AWS Github. Тем не менее, я внес небольшие коррективы, чтобы адаптировать его и обобщить для моего варианта использования.

Код github доступен здесь. Пояснения есть в самом коде.

main.py



jwt_verifier.py



AWS Lambda: посадочная функция Lambda

Лямбда-функция приземления довольно проста, она читает только заголовки, переданные запросом appsync.



Заключение

Теперь вы сможете создавать собственные авторизации на основе информации, переданной на этапе аутентификации вашего рабочего процесса. Мне нужно было время, чтобы во всем этом разобраться. Если бы это помогло только одному из вас, я был бы счастлив записать это.

Как обычно, протяни руку и счастливого развития ❤.

LinkedIn, Почта