Аутентификация AWS Cognito возвращает ошибку - Javascript SDK - PullRequest
0 голосов
/ 16 сентября 2018

Я использую AWS Cognito для аутентификации пользователей в новом приложении, которое я создаю.

Я использую библиотеку amazon-cognito-identity-js в своем проекте (ссылка на Github: https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js). Поскольку пользователи в этом конкретном пуле пользователей не могут зарегистрироваться - я регистрирую их вручную - я знаю, что мне нужно "Использовать" дело 23 ", как указано в README.md от Github.

Итак, мой код выглядит следующим образом:

    ...
    const userPoolData = {
        UserPoolId: <MY_USER_POOL_ID>,
        ClientId: <MY_CLIENT_ID>
    };

    const userPool = new CognitoUserPool(userPoolData);

    const authenticationData = {
        Username: email,
        Password: tempPassword
    };
    const userData = {
        Username: email,
        Pool: userPool
    }

    const authenticationDetails = new AuthenticationDetails(authenticationData);
    const cognitoUser = new CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (result) => {
            console.log(result);
        },
        onFailure: (err) => {
            console.log("Error from cognito auth: ", err);
        },
        newPasswordRequired: (userAttributes) => {
            delete userAttributes.email_verified;
            cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
        }
    })
    ...

Когда я выполняю этот код, я успешно подтверждаю своего пользователя. Я вижу это в консоли AWS Cognito. Однако вместо получения объекта result в консоли javascript на клиенте появляется сообщение об ошибке:

Uncaught (in promise) TypeError: Cannot read property 'onFailure' of undefined
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)

Но когда я пытаюсь войти с newPassword вместо ранее отправленного tempPassword, я теперь могу успешно получить объект result с тремя присутствующими жетонами.

Так что я знаю, что все вроде работает, но не то, что я ожидаю.

Что вызывает эту ошибку? Как я могу это исправить? Я хочу получить объект result немедленно, когда пользователь впервые войдет в систему с tempPassword и их newPassword, чтобы они могли начать использовать приложение.

EDIT:

Думать, что я должен забрать userAttributes, было ошибкой. Функция newPasswordRequired передает их автоматически. Поэтому я обновил свой код выше, добавив «Вариант использования 23», представленный на Github.

Но теперь я получаю немного другую ошибку, чем раньше:

Uncaught (in promise) TypeError: callback.onFailure is not a function
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)

Все, что касается Cognito, все еще работает, но должно быть что-то не так с моей onFailure функцией, что очень странно.

Есть мысли?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Хорошо, я решил это. Проблема заключалась в том, что я использовал функции стрелок ES6. Как указал Аполозей, мне нужно было передать this в функцию cognitoUser.completeNewPasswordChallenge. Но из-за поведения ES6 this возвращалось неопределенным. Итак, изменение моей функции cognitoUser.authenticateUser на следующее решило все:

  cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            resolve(result.getAccessToken().getJwtToken());
        },
        onFailure: function (err) {
            console.log("Error from cognito promise: ", err);
            reject(err);
        },
        newPasswordRequired: function (userAttributes) {
            delete userAttributes.email_verified;
            cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
        }
    })

Я собираюсь немного поиграть с библиотекой amazon-cognito-identity-js и посмотреть, смогу ли я получить здесь функции стрелок ES6. Это действительно раздражает, когда приходится обходить это.

Призываем Аполозея за помощью

0 голосов
/ 16 сентября 2018

Пожалуйста, обновите строку cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes); до cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this) Как правило, this обеспечит выполнение функции callback в том же объекте.

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