Хранение CognitoUser в кеше заставит его потерять некоторые свойства - PullRequest
1 голос
/ 09 марта 2019

В настоящее время я использую AWS Cognito в своем приложении.

Когда пользователь впервые подключается к своей учетной записи, Cognito возвращает NEW_PASSWORD_REQUIRED в качестве вызова, и это нормально.

Я хочу перенаправить на страницу, где пользователь может установить свой новый пароль, поэтому я положил ответ от Auth.signIn в хранилище (я пробовал локальное хранилище, хранилище сеансов и кэш из AWS Amplify), но когда я его получаю обратно на другой странице он теряет некоторые свойства, и Auth.completeNewPassword возвращает ошибку: «user.completeNewPasswordChallenge не является функцией»

Login.js:

try {
  var authPromise = Auth.signIn(this.state.email, this.state.password);
  authPromise.then((result) => {
    console.log(result);
    if (result.challengeName === 'NEW_PASSWORD_REQUIRED') {
      Cache.setItem("CognitoUser", result);
      this.props.history.push("/login/newPassword");
    }
    else {
      this.props.userHasAuthenticated(true);
      this.props.history.push("/");
    }
  });
} catch (e) {
  alert(e.message);
  this.setState({ isLoading: false });
}

NewPassword.js:

    try {
        var user = Cache.getItem("CognitoUser");
        if (user) {
            await Auth.completeNewPassword(user, this.state.newPassword);
            this.props.history.push("/");
            Cache.removeItem("CognitoUser");
        }
    } catch (e) {
        alert(e.message);
        this.setState({ isChanging: false });
    }

Есть идеи?

1 Ответ

1 голос
/ 11 марта 2019

Это javascript, поэтому, когда вы пишете в локальный кэш и сериализуете свой result в ключ "CognitoUser", он сохраняется как строка, которая после десериализации будет обычным старым Object, не знающим исходного типа перед сериализацией.

Первоначальной причиной может быть то, что ваш тип "результата" может предоставлять функции, которые не сериализуемы (если не получатель или получатель с аргументами).Я предлагаю вам позвонить и сохранить все данные, которые вы хотите, в отдельных ключах и перечитать их позже.

Cache.setItem("CognitoUser", result);
Cache.setItem("CognitoUser-value-1", result.myFunction1("myArg1"));
Cache.setItem("CognitoUser-value-2", result.myFunction2("myArg2"));

// ..

var user = Cache.getItem("CognitoUser");
var myVal1 = Cache.getItem("CognitoUser-value-1");
var myVal2 = Cache.getItem("CognitoUser-value-2");

Вы также можете сохранить один единственный ключ "CognitoUser" в вашем localStorage, если вы выполняете все указанные функциисериализации.Например, расширьте тип вашей result, добавив функции получения прототипов (без аргументов), каждый вызывая и возвращая соответствующие myFunctionX("myArgX") функции, чтобы они появлялись в процессе JSON.stringify .

...