Я новичок во многих вещах 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
. Таким образом, кажется, что единственный способ здесь будет
Использовать Cognito для аутентификации - ie. используйте identityToken
, чтобы определить имя пользователя / адрес электронной почты из нашего пула пользователей Cognito, выполняющего вызов.
Используйте пользовательский лямбда-валидатор, чтобы взять имя пользователя, сопоставить его с идентификатором пользователя и запросить, связан ли идентификатор проекта с этим пользователем. Если это так, то разрешите запрос. Если нет, то отрицайте.
Есть ли лучший способ сделать это? Я могу только одним путем идти вперед (вверху), но он кажется довольно громоздким, и мне интересно, пропускаю ли я что-то фундаментальное.