Использование авторизационного кода Amazon Cognito с бессерверным / одностраничным веб-приложением - PullRequest
3 голосов
/ 16 марта 2019

Я пытаюсь разработать бессерверное веб-приложение 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;
    }

1 Ответ

0 голосов
/ 18 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...