AWS Amplify Auth.updateUserAttributes()清空存储致登出问题咨询
AWS Amplify Auth.updateUserAttributes() 清空认证令牌问题排查
我正在开发一个基于AWS Cognito作为认证服务的Web应用,使用aws-amplify实现客户端功能。调用Auth.updateUserAttributes()更新用户自定义属性时,发现该函数会清空localStorage/sessionStorage中所有Cognito相关项(包括idToken、refreshToken、accessToken),导致应用表现为已登出。
配置与代码示例
Auth配置代码
Amplify.configure({ Auth: { userPoolId: process.env.REACT_APP_AWS_COGNITO_USER_POOL_ID, region: process.env.REACT_APP_AWS_COGNITO_REGION, userPoolWebClientId: process.env.REACT_APP_AWS_COGNITO_APP_CLIENT_ID, storage: window.localStorage, authenticationFlowType: 'CUSTOM_AUTH', }, });
更新属性代码
let user = await Auth.currentAuthenticatedUser(); console.log(JSON.stringify(localStorage)); // 输出包含idToken、refreshToken等Cognito相关项的localStorage const result = await Auth.updateUserAttributes(user, { 'custom:attributes_1': '123456789', }); console.log(result); // 输出:SUCCESS console.log(JSON.stringify(localStorage)); // 仅剩余'amplify-signin-with-hostedUI',令牌等项已消失
执行后无法操作页面,刷新后需重新登录,切换为sessionStorage问题依旧。现提出以下问题:
- 该行为是否正常?Auth.updateUserAttributes()会强制登出吗?
- 若正常,有无避免强制登出的方法?
- 若异常,代码/配置或Cognito服务需做哪些调整?
问题解答
该行为是否正常?Auth.updateUserAttributes()会强制登出吗?
这个行为不正常。Auth.updateUserAttributes()的设计目标是更新用户属性,官方文档未提及该方法会主动清空认证令牌或触发登出操作,因此这属于异常情况。若正常,有无避免强制登出的方法?
由于该行为属于异常,此场景不适用。但如果是特殊场景下(比如更新敏感属性后Cognito强制刷新令牌),可以尝试在更新属性后手动重新获取用户会话:
const result = await Auth.updateUserAttributes(user, { 'custom:attributes_1': '123456789', }); // 更新后重新获取用户会话,恢复令牌 await Auth.currentAuthenticatedUser({ bypassCache: true });
- 若异常,代码/配置或Cognito服务需做哪些调整?
可从以下方向排查调整:
- 升级AWS Amplify版本:旧版本Amplify Auth可能存在此类bug,建议升级到最新稳定版(如
aws-amplify@^5.x及以上)。 - 验证Cognito用户池配置:
- 确认用户池客户端的认证流程配置与代码中
authenticationFlowType: 'CUSTOM_AUTH'匹配,避免配置冲突。 - 检查自定义属性
custom:attributes_1是否已在Cognito用户池属性中启用,并设置为用户可修改(勾选"可写"选项)。
- 确认用户池客户端的认证流程配置与代码中
- 排查自定义认证流程:如果使用了CUSTOM_AUTH的触发器(如Define Auth Challenge、Create Auth Challenge),确认更新属性后触发器未触发登出或令牌失效逻辑。
- 临时 workaround:手动备份恢复令牌:
let user = await Auth.currentAuthenticatedUser(); // 备份当前令牌 const backupTokens = { refreshToken: user.signInUserSession.refreshToken.token }; const result = await Auth.updateUserAttributes(user, { 'custom:attributes_1': '123456789', }); // 恢复会话 await Auth.signIn(user.username, { refreshToken: backupTokens.refreshToken });
内容的提问来源于stack exchange,提问作者Yuchen Qiao
相关产品推荐
相关产品推荐

