Контекционированный пользовательский интерфейс
Я изучал настройку входа в систему для веб-приложения, которое позволяет клиентам просматривать данные, размещенные на S3, и обнаружил, что AWS Cognito имеет размещенный веб-интерфейс [ link], который обрабатывает большую часть потока аутентификации для меня, проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как интегрировать вывод веб-интерфейса в мое приложение. Большая часть существующей документации в Cognito просто ссылается на то, как использовать различные API в создании собственного пользовательского интерфейса, что оставляет меня с запутанными ответами на мою проблему.
Есть ли какая-либо информация, которая была создана с учетом пользовательского интерфейса Cognito?
Amazon говорит, что вы можете интегрировать аутентифицированный логин с Cognito за несколько минут, но я смотрел на это несколько недель и не могу понять это.
Ответы
Ответ 1
Я также боролся с этим; Я согласен с тем, что документация немного освещена.
Указанная вами ссылка показывает, как выглядит ваш URL-адрес пользовательского интерфейса Cognito:
https://<your_domain>/login?response_type=code&client_id=<your_app_client_id>&redirect_uri=<your_callback_url>
Идея состоит в том, что вы отправляете своего пользователя в этот URI, они занимаются своим делом, а затем перенаправляются обратно к вам с помощью своего рода токенов или кода. Вы можете проверить свой домен, нажав "Доменное имя" в левой панели навигации.
Настройки клиента приложения и типы предоставления OAuth
Сначала проверьте настройки вашего приложения. Вам нужно будет переименовывать URL-адреса обратного вызова (где Cognito будет перенаправляться обратно) и убедиться, что разрешен хотя бы один поток OAuth.
Настройки клиента Cognito App
"Предоставление кода авторизации" вернет код авторизации, который затем вы отправите в конечную точку oauth2/token
, чтобы получить access_token, id_token и refresh_token. Это хороший выбор, если у вас есть фоновое приложение и вы хотите обновить токены.
"Явное предоставление" - это то, что я использую в своем внешнем приложении. Он вернет токен доступа и токен идентификатора непосредственно в моем интерфейсном приложении.
Чтобы использовать неявное предоставление, измените response_type=code
на response_type=token
в URL-адресе Cognito UI.
Неявный пример гранта
Итак, если ваша переадресация после успешной проверки подлинности выглядит так:
https://localhost:3000/#access_token=eyJraWQiOiJG...&id_token=eyJraWQZNg....&token_type=Bearer&expires_in=3600
Вам просто нужно очистить id_token от URL-адреса и отправить его в Cognito, а ваш пул пользователей - в качестве ключа на карте Logins. В Javascript:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:bxxxxxx6-cxxx-4xxx-8xxx-xxxxxxxxxx3c',
Logins: {
'cognito-idp.us-east-1.amazonaws.com/us-east-1_ixxxxxxx': idToken
}
});
Где idToken
- это токен идентификатора, который вернулся к вам при перенаправлении.
Тип разрешения кода авторизации
Если вместо этого вы используете тип предоставления кода авторизации (response_type = code), ваш задний конец должен будет вызвать конечную точку /oauth2/token
для обмена кодом для токенов. Этот вызов будет выглядеть примерно так:
curl -X POST \
https://<my-cognito-domain>.auth.us-east-1.amazoncognito.com/oauth2/token \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code&scope=email%20openid%20profile&redirect_uri=https%3A%2F%2Flocalhost%3A3000%2F&client_id=15xxxxxxxxxxxxxx810&code=54826355-b36e-4c8e-897c-d53d37869ee2'
Затем вы можете передать этот токен идентификатору Cognito, как указано выше.
Примечания к пользовательскому интерфейсу
Мое приложение выдает пользовательский интерфейс Cognito на новой вкладке, когда пользователь нажимает на ссылку. Когда перенаправление возвращается в мое приложение, я использую postMessage()
для отправки токенов в родительское окно, которое затем закрывает новую вкладку. Я думаю, что это довольно распространенная картина.
Я не пробовал, но я предполагаю, что отображение пользовательского интерфейса в iframe запрещено, как смягчение против нажатия. Источник
Я надеюсь, что это, по крайней мере, несколько полезно. Удачи!
Ответ 2
Я реализовал этот поток, не используя Amplify, а просто используя Cognito Hosted UI:
- Пользователь переходит на мой сайт (вкладка 1), и на любой странице пользователь нажимает кнопку входа/регистрации.
- Новая вкладка (вкладка 2) открыта в пользовательском интерфейсе cognito, размещенном на моем собственном домене (auth.example.com).
- Затем пользователь делает свой бизнес на размещенном интерфейсе (логин/новая учетная запись/восстановление пароля и т.д.)
- Cognito отправляет HASH в URL-адресе (с множеством токенов) для обратного вызова моего сайта (https://example.com/login).
-
Мой сайт обрабатывает токены: хитрость в том, чтобы создать экземпляр Auth, этот может проанализировать хеш и создать пользователя в LocalStorage:
// mysite.com/login
import {CognitoAuth} from 'amazon-cognito-auth-js';
// Configuration for Auth instance.
var authData = {
UserPoolId: 'us-east-1_xxxx',
ClientId: '1vxxxxx',
RedirectUriSignIn : 'https://example.com/login',
RedirectUriSignOut : 'https://example.com/logout',
AppWebDomain : 'example.com',
TokenScopesArray: ['email']
};
var auth = new CognitoAuth(authData);
//Callbacks, you must declare, but can be empty.
auth.userhandler = {
onSuccess: function(result) {
},
onFailure: function(err) {
}
};
//Get the full url with the hash data.
var curUrl = window.location.href;
//here is the trick, this step configure the LocalStorage with the user.
auth.parseCognitoWebResponse(curUrl);
window.top.close();
-
После установки пользователя в локальном хранилище обратный вызов (вкладка 2) закрывается.
-
На моем сайте (вкладка 1) я настраиваю EventListener для прослушивания, если есть изменения в локальном хранилище.
constructor() {
window.addEventListener('storage', this.userLogged);
}
userLogged(event) {
if (event.key.indexOf('CognitoIdentityServiceProvider') !== -1) {
var data = {
UserPoolId: 'us-east-1_xxxxx',
ClientId: 'xxxxx'
};
var userPool = new CognitoUserPool(data);
//behind the scene getCurrentUser looks for the user on the local storage.
var cognitoUser = userPool.getCurrentUser();
}
}
- С CognitoUser вы сделали, потому что вы можете получить учетные данные или другие данные.
Ответ 3
Чтобы использовать размещенный пользовательский интерфейс, необходимо указать доменное имя, в котором размещен пользовательский интерфейс. Вам также необходимо установить URI перенаправления - один для входа после, другой для выхода после. Вы делаете оба в Консоли AWS, на странице настроек для пула пользователей Cognito.
Замените установленные вами URI в следующем формате: {URL-адрес домена}/login? Response_type = code & client_id = {ID клиента приложения} & redirect_uri = {URL-адрес обратного вызова}
Например: https://my-user-pool.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=a1b2c3d4e5f6g7h8i9j0k1l2m3&redirect_uri=https://my-website.com
Этот адрес отображает форму входа. После входа пользователь перенаправляется на https://my-website.com с кодом, добавленным к URI, например: https://my-website.com?code=f0ee2961-f349-44c7-92b1-0400c762573b
Источник
Справочник по API - объясняет шаблон для /login,/logout и других конечных точек.
Ответ 4
Вы можете найти более подробную информацию о том, как сделать эту работу здесь -
https://aws.amazon.com/blogs/aws/launch-amazon-cognito-user-pools-general-availability-app-integration-and-federation/
http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-ux.html
http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-ui-customization.html