Amazon Cognito: как передать учетные данные серверному приложению

У меня есть клиентское приложение (разработанное на Java, а не на Android), которое аутентифицирует пользователя с помощью пула пользователей Amazon Cognito. Для ясности: это приложение отображает диалоговое окно ввода имени пользователя/пароля, а затем выполняет аутентификацию с помощью службы пула пользователей Cognito, используя метод SRP; потенциальные проблемы обрабатываются в этом диалоговом окне (идентификатор устройства, пароль должен быть изменен, два фактора и т. д.). В итоге у меня есть ряд токенов, которые позволяют программе использовать сервисы AWS с учетными данными пользователя.

Теперь мне нужно клиентское приложение для связи с пользовательским приложением на стороне сервера. Клиент должен будет подтвердить свою личность серверному приложению, которое затем будет взаимодействовать с другими сервисами AWS. Здесь у меня есть два разных варианта использования:

1) Серверу нужно только знать, кто является пользователем, прошедшим проверку подлинности клиента (безопасным способом, но без олицетворения пользователя).

2) Клиенту необходимо делегировать некоторые или все привилегии пользователя серверу; затем сервер выполнит некоторые действия в сервисах AWS от имени этого пользователя.

Серверное приложение, скорее всего, будет разработано на Java и будет работать на машине EC2. Меня интересует только аутентификация пользователя через источник пула пользователей Cognito (то есть меня не интересуют потоки аутентификации на основе Facebook/Google/OpenID).

Кажется, довольно легко достичь обеих целей очень небезопасными способами: просто заставьте клиентское приложение отправить на сервер все предоставленные ему токены. Но это явно не выход.

Тем не менее, мне трудно понять из документации Cognito User Pool/Cognito Identity Pool/IAM/STS, как этого можно добиться правильно. Я бы ожидал, например, что клиентское приложение сможет генерировать какой-то «токен делегирования», который можно передать на сервер; затем сервер должен иметь возможность проверять этот токен и извлекать из него идентификационную информацию (удовлетворение № 1) или олицетворять личность, соответствующую маркеру, для выполнения вызовов сервисов AWS (удовлетворение № 2). А может я неправильно это мыслю?


person jwatkins    schedule 01.02.2017    source источник


Ответы (1)


Вы указываете на поток предоставления кода OAuth 2.0, который в настоящее время не поддерживается Amazon Cognito.

Текущий доступный безопасный способ сделать это — передать токен идентификатора от клиента к серверу, а затем проверить этот токен и извлечь из него идентификационную информацию. Это подтверждает личность вызывающего абонента, поскольку вы можете проверить подпись токена идентификатора.

person Rachit Dhall    schedule 13.02.2017
comment
У меня было смутное воспоминание о том, что в OAuth 2 есть специальный поток для этой цели, хотя я не мог вспомнить его название. Спасибо, что указали на это. Теперь, не рискованно ли передавать токен идентификатора от клиента к серверу? Конечно, я могу передать его через SSL, но все же... Каков потенциальный риск его раскрытия? Очевидно, что кто-то может выдать себя за пользователя в отношении моего конкретного сервера, но можно ли сделать что-то большее? - person jwatkins; 15.02.2017