我目前正在我的应用程序中使用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 });
}
有任何想法吗 ?
它是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进程中。