将CognitoUser存储在缓存中会使他失去一些属性

问题描述 投票:1回答:1

我目前正在我的应用程序中使用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 });
    }

有任何想法吗 ?

reactjs local-storage amazon-cognito session-storage
1个回答
1
投票

它是javascript所以当你写你的localcache并将你的result序列化到"CognitoUser"键时,它被存储为一个字符串,之后反序列化将是一个普通的旧Object,在序列化之前不知道原始类型。

原因可能是您的“结果”类型可能会暴露不可序列化的函数(如果不是getter,或者带有参数的getter)。我建议您将所需的所有数据调用并存储到单独的密钥中,然后再重新阅读。

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");

如果您将所有所述函数序列化,您还可以在localStorage中保留一个单键"CognitoUser"。例如,扩展result的类型,添加原型getter函数(无参数),每个函数调用并返回相应的myFunctionX("myArgX")函数,以便它们出现在JSON.stringify进程中。

© www.soinside.com 2019 - 2024. All rights reserved.