Аутентифицировать пользователя федерации социальной идентификации в AWS Userpool? - Android
Мы использовали com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.6.8
SDK для имени пользователя и пароля на основе входа в систему и регистрации потока. Следуя подходу, упомянутому здесь, https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-integrating-user-pools-android.html. Регистрация и вход в систему работает как требуется.
Для аутентификации Facebook и Google через федерацию, мы не хотим использовать размещенный пользовательский интерфейс для этой цели и не используем федеративные идентификаторы. Мы перешли по этой ссылке https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-identity-federation.html.
- Мы настроили пул пользователей с клиентским приложением и доменом пула пользователей.
- Настройте Facebook в качестве поставщика социальной идентификации.
- Добавлен обратный URL для Android на мобильный телефон.
Первый подход
Мы изучаем пример приложения CognitoSyncDemo, оно использует федеративную идентификацию, поэтому нам пришлось отказаться от него. Мы просто используем федерацию в пуле пользователей.
Второй подход
Мы использовали веб-просмотр и загрузили приведенный ниже URL. URL перенаправляет меня прямо в Facebook, после аутентификации возвращает меня к перенаправлению URL с access_token, auth_type, expires in и id_token. Но нет обновления токена. URL https://yourdomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?redirect_uri=redirect_app_path&response_type=code&client_id=%22client_id%22&identity_provider=Facebook
Но есть проблема с использованием этого подхода. Я не смог найти способ передать токен доступа в cognitoUserSession в SDK, который управляет пользовательским сеансом. Поэтому каждый раз, когда я регистрируюсь с помощью Facebook (используя веб-просмотр), в SDK нет поддержки сеансов. Следовательно, я перенаправлен на страницу входа снова. Как убедиться, что пользователь Facebook аутентифицирован и авторизован cognitoidentityprovider? Как создать сеанс пользователя в SDK при получении access_token и id_token?
Третий подход
Мы пытались использовать демонстрационную версию Cognito Auth https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoAuthDemo. Для этого мы должны добавить еще одну библиотеку com.amazonaws:aws-android-sdk-cognitoauth
, После нажатия на кнопку "Войти", он переходил к hosted-ui. Изучив аналогичный проект IOS, мы внесли изменения в проект библиотеки Android (com.amazonaws:aws-android-sdk-cognitoauth для Android). Мы добавили identity_provider в URI для входа в систему. Затем он перенаправляет нас прямо в Facebook на вкладке Chrome. После аутентификации он установил сессию в нашем приложении. Но у него есть собственный объект аутентификации, который является AuthSession, но ранее мы использовали CogintoUserSession для обычной регистрации. AuthSession не имеет атрибутов пользователя и не предлагает никаких сведений о пользователе или обработчиков аутентификации. Если мы используем этот подход, то как связать AuthSession с CognitoUserSession и управлять пользовательским сеансом в приложении?
Резюме
Короче говоря, мы устали от сэмплов AWS, и это приводит нас к веб-интерфейсу. Нам нужно аутентифицировать пользователя через Facebook, чтобы пользовательский пул использовал только провайдера идентификации федерации. Нам нужно поддерживать сеанс в Cognito SDK, не влияя на наш поток входа в систему на основе имени пользователя и пароля. Мы хотим открывать Facebook напрямую или просматривать веб-страницы в нашем приложении по нажатию кнопки, аутентифицировать пользователя и поддерживать сеанс в приложении, используя только Cognito SDK.
1 ответ
Чтобы подключиться к пулу пользователей, я включил aws-android-sdk-cognitoidentityprovider. Но если вам нужно добавить социальную регистрацию, вам также нужно добавить cognitoauth.
Убедитесь, что версия Cognito SDK одинакова, иначе вы можете столкнуться с ошибкой усложнения.
В соответствии с потребностями проекта, мне нужен провайдер идентификации, чтобы перейти в SDK, чтобы он мог напрямую перейти на мою страницу провайдера социальной идентификации. Но текущая версия SDK ' 2.6.24 ' не предоставила мне это положение. Я скачал android-sdk-cognitoauth sdk из awslab github и включил в свой проект. Я изменил класс Auth.java, добавил в него переменную провайдера идентификации.
Следующим шагом я изменяю метод AuthClient.java launchCognitoAuth. Я помещаю дополнительное условие, чтобы проверить, если провайдер идентификации или нет. Затем я установил его в знак входа в URI.
if (pool.getIdentityProvider() != null) { builder.appendQueryParameter(ClientConstants.DOMAIN_QUERY_PARAM_IDENTITY_PROVIDER, pool.getIdentityProvider().toString()); }
После внесения вышеуказанных изменений я могу настроить провайдера идентификации через свое приложение в auth.builder(). Взлом сработал, я напрямую перешел на страницу своего провайдера. После аутентификации sdk установил сессию самостоятельно.
Подводя итог, я обнаружил разницу между реализацией проекта Android и IOS. В проекте iOS aws предоставил возможность напрямую добавлять провайдера идентификации. Я проследил за ходом проекта ios и внёс изменения в проект android congitio-auth. О разнице сообщалось и о проблемах aws-sdk-android-sample.