Как проверить разрешения Cognito в API Gateway - PullRequest
0 голосов
/ 17 ноября 2018

Попытка понять, как использовать Cognito и API Gateway для защиты API.

Вот что я понимаю из документации AWS и пользовательского интерфейса Cognito:

Клиенты

  • www-public - общедоступный веб-сайт
  • www-admin - администраторы сайта

Серверы ресурсов

  • Цены - в этом простом примере API предоставит безопасный доступ к этому ресурсу.

1024 * Прицелы *

  • prices.read
  • prices.write

Опять же, очень простые разрешения на 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?

Несколько предположений, потому что я в основном в темноте. Я думаю, что основы есть, но не уверен, как соединить все вместе.

Надеясь, что кто-то понял это.

...