Попытка понять, как использовать Cognito и API Gateway для защиты API.
Вот что я понимаю из документации AWS и пользовательского интерфейса Cognito:
Клиенты
- www-public - общедоступный веб-сайт
- www-admin - администраторы сайта
Серверы ресурсов
- Цены - в этом простом примере API предоставит безопасный доступ к этому ресурсу.
1024 * Прицелы *
Опять же, очень простые разрешения на API. Публичные пользователи www могут читать цены, администраторы могут писать их.
API-шлюз
- GET / Цены - доступны для аутентифицированных пользователей, которые могут читать цены.
- POST / цены - только для администраторов
Пользователи
- Администраторы - могут обновлять цены методом POST.
- Не администраторы - не могут обновлять цены.
На основании этого ...
Каждый клиент запрашивает интересующие его области. Поэтому для общедоступного веб-сайта он запрашивает prices.read
, а для административного сайта - prices.read
и prices.write
.
Шлюз API будет использовать два Cognito Authorisers, по одному для каждого HTTP-глагола. Таким образом, метод GET
должен проверять, может ли пользователь читать цены, а метод POST
, что он может записывать цены.
Немного не вижу, как собрать все это воедино. Я могу заставить клиентов запрашивать области, но как они теперь подключаются к пользовательским разрешениям?
Когда генерируется токен, где находится функция, которая говорит: «Хорошо, вы запросили эти области, теперь я собираюсь проверить, есть ли у этого пользователя это разрешение и даст ли вам нужный токен?»
Я понимаю, что области действия, в конечном счете, связаны с утверждениями, которые будут возвращены в токене. Например, запрос объема profile
означает, что токен будет содержать определенные утверждения, например, email
, surname
и т. Д.
Я думаю исходя из этого, что мои разрешения в конечном итоге окажутся утверждениями, которые возвращаются при запросе конкретных областей. Тот факт, что два клиента различаются в том, что они запрашивают, означает, что требование prices write
никогда не будет возвращено общедоступному клиенту www. Он никогда не выдаст токен, если будет запрошено требование prices.write
.
Чего я не вижу, так это в Cognito. Существует возможность объединять пользователей в группы, но это почти все. Точно так же нет ничего (что я мог видеть), чтобы связать объемы с претензиями.
Я работаю в среде .Net и Identity Server. Конечно, в последней версии Identity Server, на которую я смотрел, был метод-обработчик, с помощью которого вы должны были бы определить, какие утверждения помещать в токен. Я предполагаю, что это отобразится в одну из пользовательских функций лямбда-обработчика в Cognito. Оттуда нужно будет запросить Cognito и выяснить, какие претензии выдавать?
Последняя часть головоломки - это то, как API-шлюз проверяет заявки. Можно ли это сделать в API-шлюзе или необходимо проверить токен в функции Lambda, которую я напишу для обработки запроса API-шлюза?
Конечно, с использованием Identity Server и .Net была клиентская библиотека, которую вы использовали бы в API для проверки заявок и соответственно редактирования разрешений. Угадаете, есть ли что-то похожее в лямбда-функции Node JS?
Несколько предположений, потому что я в основном в темноте. Я думаю, что основы есть, но не уверен, как соединить все вместе.
Надеясь, что кто-то понял это.