Я пытаюсь разработать бессерверное веб-приложение JavaScript, состоящее из API Gateway (с Amazon Cognito Custom Authorizer), Lambda и DynamoDB.Этот пост - моя последняя попытка заставить Cognito работать для моих нужд, прежде чем полностью отказаться от него (во второй раз).Я постараюсь немного углубиться в то, что узнал, поскольку документация Cognito запутана и отсутствует.
С Cognito вы можете разработать собственный рабочий процесс аутентификации с вашей собственной регистрацией, входом в систему и т. Д. Веб-страницами.,У вас также есть возможность использовать размещенный веб-интерфейс Amazon для упрощения работы (хотя с очень небольшим количеством настроек HTML / CSS). Я использую последнее.
При настройке приложения-клиента для пула пользователей Cognito самое важное решение, которое вы должны принять, - это использовать предоставление кода авторизации или неявное предоставление,С предоставлением кода авторизации успешная аутентификация вернет вашему абоненту токен сеанса, содержащий идентификаторы JWT id_token, access_token и refresh_token.С неявным предоставлением, ваш абонент получит код авторизации, который может быть использован для получения только id_token и access_token, без refresh_token.Неявное предоставление наиболее подходит для приложений без серверов (или одностраничных), поскольку оно не предоставляет клиенту долгоживущий файл refresh_token, который можно легко скомпрометировать и использовать для получения допустимого доступа к вашему приложению.Однако access_token имеет фиксированный срок действия в один час, который не может быть настроен в настоящее время.Таким образом, без токена обновления для автоматического обновления access_token вашему пользователю придется входить в систему каждый час.
Поскольку мое веб-приложение никоим образом не содержит конфиденциальную информацию, я собираюсь использовать Предоставление кода авторизациии сохраните токены в браузере LocalStorage (, что небезопасно, не рекомендуется и является плохой практикой ) в надежде, что в какой-то момент Cognito будет полностью соответствовать спецификации OpenId иобеспечить полную поддержку токенов обновления с неявными разрешениями с помощью prompt = none .Как вы можете видеть, Amazon не отвечает на этот вопрос.Черт, даже вариант настройки времени истечения срока действия access_token (с неявным предоставлением) был бы хорошим компромиссом.
Так что я успешно развернул пример приложения из amazon-cognito-auth-js Библиотека JavaScript, предназначенная для использования с потоком размещенного веб-интерфейса.Это не следует путать с библиотекой amazon-cognito-identity-js, которую следует использовать, если вы разрабатываете свой собственный рабочий процесс аутентификации.Библиотека amazon-cognito-auth-js поддерживает как предоставление кода авторизации, так и неявное предоставление и будет обрабатывать анализ токенов, кэшировать / извлекать их в / из LocalStorage и молча обновлять access_token с токеном обновления (для кода авторизации)Предоставить).
При входе в систему URL моего браузера выглядит следующим образом: https://www.myapp.com/home?code=ABC123XYZ..., и три токена JWT устанавливаются в LocalStorage браузера.Однако, если я немедленно обновляю страницу, я получаю ошибку «invalid_grant», потому что код авторизации все еще находится в URL и уже используется.Стоит ли просто перенаправить страницу после успешного входа, чтобы удалить код авторизации из URL?Вот основной код, который я собираюсь вызывать из onLoad () каждой страницы моего приложения:
function initCognitoSDK() {
var authData = {
ClientId : '<TODO: your app client ID here>', // Your client id here
AppWebDomain : '<TODO: your app web domain here>', // Exclude the "https://" part.
TokenScopesArray : <TODO: your scope array here>, // like ['openid','email','phone']...
RedirectUriSignIn : '<TODO: your redirect url when signed in here>',
RedirectUriSignOut : '<TODO: your redirect url when signed out here>',
IdentityProvider : '<TODO: your identity provider you want to specify here>',
UserPoolId : '<TODO: your user pool id here>',
AdvancedSecurityDataCollectionFlag : <TODO: boolean value indicating whether you want to enable advanced security data collection>
};
var auth = new AmazonCognitoIdentity.CognitoAuth(authData);
// You can also set state parameter
// auth.setState(<state parameter>);
auth.userhandler = {
onSuccess: function(result) {
alert("Sign in success");
showSignedIn(result);
},
onFailure: function(err) {
alert("Error!" + err);
}
};
// The default response_type is "token", uncomment the next line will make it be "code".
auth.useCodeGrantFlow();
return auth;
}