adminuserglobalsignout не возвращает никаких данных или не ожидает обещания - PullRequest
0 голосов
/ 06 июня 2019

При ожидании обещания в результате adminuserglobalsignout обещание, кажется, возвращается, но данные ничего не содержат.

Следующий вызов после выхода из системы - аутентификация пользователя.возвращается правильный accessToken, но он уже отозван, что заставляет меня думать, что обещание не ожидает корректно, а новые учетные данные подписываются предыдущим вызовом, который все еще выполняется.

Мы используем globalsignout, чтобы запретить пользователям иметьнесколько сессий, поэтому рабочий процесс идет по линиям

authenticate -> success -> signout (чтобы завершить любые другие сеансы) -> authenticate -> success -> return token

Я обновил свою лямбдупакет для включения последней версии SDK 2.469.0 и без улучшений.

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

В ОБА случаяхпохоже, что нулевые данные возвращаются из секции AWS call

лямбда-кода, который вызывает метод выхода из библиотеки User

    try {

        signOutResult = await User.globalSignOut(userId, process.env.COGNITO_POOL);

    } catch (err) {

        log.error("AWS Global Signout Error: " + JSON.stringify(err));
        responseBody = Helper.buildCORSResponse(502, JSON.stringify({ message: err }));

        return callback(null, responseBody);

    }

globalsignout code в библиотеке User:


    return new Promise((resolve, reject) => {

        log.info(`globalSignOut: Signing ${Username} out from all devices in pool ${UserPoolId}`);

        const signOutRequest = new AWS.CognitoIdentityServiceProvider({ apiVersion: "2016-04-18" }).adminUserGlobalSignOut({ Username, UserPoolId });
        const signOutPromise = signOutRequest.promise();

        signOutPromise.
            then((data) => {

                log.debug("globalSignOut: Cognito SignOut Success: " + JSON.stringify(data));
                resolve(data);

            }).catch((err) => {

                log.error("globalSignOut: Cognito SignOut Error: " + err);
                reject(err);

            });

    });

}

При каждом вызове мы достигаем разрешения без проблем, а затем продолжаем аутентифицироватьОн снова пользователь.

            log.debug("globalSignOut: Cognito SignOut Success: " + JSON.stringify(data));
            resolve(data);

Кто-нибудь видит какие-либо проблемы, которые могут быть причиной этого?Я попробовал несколько способов указать обещание и использовать тот же формат, который отлично работает для других служб и ждет обещания результата, прежде чем будет продолжено выполнение кода.

Весь совет очень ценится

1 Ответ

0 голосов
/ 12 июня 2019

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

Спасибо, что обратились к нам.

Чтобы устранить эту проблему, я попытался повторить ее на своем конце, протестировав упомянутый ниже поток (как указано вами в):

Аутентификация пользователя -> Глобальный выход -> Аутентификация еще раз ---> Проверка действия нового токена

Я написал код на Python для реализации вышеуказанного потока. В процессе, после вызова метода globalSignOut, я снова аутентифицировал пользователя и проверил действительность токена, выполнив вызов API getUser. Но вызов API getUser вернул следующий ответ: «Произошла ошибка (NotAuthorizedException) при вызове операции GetUser: токен доступа был отозван»

Теперь я добавил функцию сна после GlobalSignOut на 1 секунду, и поток работал правильно. Я провел несколько тестов со временем ожидания и заметил, что если мы добавим период ожидания 0,6 секунды или больше, API будет работать правильно. Таким образом, кажется, что вызов API GlobalSignOut немедленно возвращает ответ, но глобальный процесс выхода из системы (отзыв токенов) все еще выполняется в бэкэнде в течение приблизительно 0,6 секунд.

Для этого я обратился к команде разработчиков Cognito, чтобы подтвердить такое поведение вызова API GlobalSignOut. Команда подтвердила, что это ожидаемое поведение вызова API GlobalSignOut. При вызове GlobalSignOut все токены, выпущенные до этого времени, считаются недействительными. Если разрыв между выходом из системы и аутентификацией очень мал (по моим тестам, это приблизительно 0,6 секунды), проблема с токеном после аутентификации может быть обработана для выдачи перед вызовом выхода из системы и, для большей безопасности, считается недействительной.

Я надеюсь, что приведенная выше информация поможет. Если я могу чем-нибудь помочь, пожалуйста, дайте мне знать. Я буду более чем рад помочь вам.

Хорошего дня впереди.

С уважением,

Amazon Web Services

...