AWS предоставляет два возможных способа работы с Cognito:
- "старый" через
amazon-cognito-identity-js
(и, возможно,amazon-cognito-auth-js
) и - "новый" через
aws-amplify
(который включает вышеуказанный)
После некоторых проблем и обратного проектирования мне удалось успешно войти в систему (вернуть CognitoIdentityCredentials), используя aws-amplify
локально как часть усилий по разработке.
Шаги, где (терпите меня, так как они важны для ответов на вопросы, а также могут кому-то помочь):
Настраивать
Создайте пул пользователей в консоли Cognito
Создайте клиент приложения пула пользователей в консоли Cognito
Создайте веб-приложение Google в консоли Google
Настройте Google Web App так, чтобы он указывал на http://localhost:8080 (мой локальный сервер разработки)
Настройте пул пользователей для использования Google в качестве поставщика удостоверений, предоставив ему идентификатор клиента веб-приложения Google и секрет клиента из консоли Google.
Создайте пул удостоверений в консоли Congnito и настройте его для работы с Google в качестве поставщика удостоверений, также предоставив туда идентификатор клиента веб-приложения Google.
Реализация
- Настройте Amplify.Auth:
Amplify.configure({ Auth: { identityPoolId: , region: , userPoolId: , userPoolWebClientId: } });
- Внедрить скрипт Google API:
const script = document.createElement('script'); script.src = 'https://apis.google.com/js/platform.js'; script.async = true; script.onload = this.initGapi; document.body.appendChild(script);
- Инициируйте Google API:
window.gapi.load('auth2', function() { window.gapi.auth2.init({ client_id: , scope: 'profile email openid' }); });
- Разрешить одним нажатием кнопки пользователю Google подписаться:
const ga = window.gapi.auth2.getAuthInstance(); const googleUser = await ga.signIn(); const {id_token, expires_at} = googleUser.getAuthResponse(); const profile = googleUser.getBasicProfile();
- Используйте
profile
,id_token
,expires_at
выше, чтобы создать сеанс учетных данных Cognito:
const user = { email: profile.getEmail(), name: profile.getName() }; const credentials = await Auth.federatedSignIn( 'google', {token: id_token, expires_at}, user );
На этом этапе был возвращен объект CognitoIdentityCredentials
, правильно заполненный, с токеном и всем ...
Проблема
К сожалению, aws-amplify
добавляет колоссальные 190 КБ к моему пакету веб-пакетов приложений (сжатый с помощью GZIP, минимизированный, оптимизированный), из-за чего я подавился кофе.
Вопрос 1
Можно ли это как-то уменьшить с помощью плагина Babel, которого мне не хватает (я предполагаю, что нет, поскольку AWS, по-видимому, все еще в 1995 году и настраивает все на одноэлементных объектах Amplify
и Auth
).
вопрос 2
Я сделал это излишне сложным, и есть ли гораздо более надежное решение?
Вопрос 3 (самый важный)
Можно ли этого достичь "старым способом" amazon-cognito-identity-js
, который НАМНОГО меньше?
Мне не удалось найти среди всех (вариантов использования) [https://github.com/aws/aws-amplify/tree/master/packages/amazon-cognito-identity-js/] вариант использования для социального / федеративного входа.