Защита ресурса REST API Gateway с помощью Cognito - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок во многих вещах OAuth2, но я пытаюсь реализовать этот рабочий процесс с помощью AWS Cognito в реализации API-шлюза REST и пытаюсь понять, правильно ли я думаю об этом.

Я использую API-шлюз, который запрашивает внутреннюю базу данных Postgres, содержащую множество бизнес-логи c. Например, созданы две таблицы - user и projects. userId 1 имеет projectId 23 и 45, в то время как userId 2 имеет projectId 20 и 60.

Я создал множество конечных точек REST на моем API-шлюзе с интеграцией прокси-сервера Lambda, которая выполняет некоторые проверки и составляет запрос к нашему бэкэнду Postgres для правильных ресурсов и обрабатывает форматирование возвращенного результирующего набора из Postgres, чтобы его можно было легко использовать нашим клиентом веб-интерфейса (React SPA).

Я настроил AWS Cognito, и он отлично справляется с аутентификацией в нашем пуле пользователей - мы используем его для входа и выхода из системы. Однако у меня возникли проблемы с отображением использования пулов пользователей Cognito для авторизации на основе ресурсов. В частности, я понимаю, как определять пользовательские области для различных конечных точек, используя Cognito validator из AWS docs .

Каждый пример, который я до сих пор видел, определяет область действия как что-то вроде projects.read, предоставляя доступ только для чтения к ресурсу projects. Однако я должен убедиться, что userId 1 может читать projectId 23 (его собственный проект), но не projectId 60 (проект userId). Как бы я это сделал, используя Custom Scopes?

По моим исследованиям это не представляется возможным, поскольку мои логики c для сопоставления пользователей с их набором разрешенных разрешений содержатся в таблице users в моем Postgres RDS. , который имеет FK user_id в projects. Таким образом, кажется, что единственный способ здесь будет

  1. Использовать Cognito для аутентификации - ie. используйте identityToken, чтобы определить имя пользователя / адрес электронной почты из нашего пула пользователей Cognito, выполняющего вызов.

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

Есть ли лучший способ сделать это? Я могу только одним путем идти вперед (вверху), но он кажется довольно громоздким, и мне интересно, пропускаю ли я что-то фундаментальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...