You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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问题依旧。现提出以下问题:

  1. 该行为是否正常?Auth.updateUserAttributes()会强制登出吗?
  2. 若正常,有无避免强制登出的方法?
  3. 若异常,代码/配置或Cognito服务需做哪些调整?

问题解答

  1. 该行为是否正常?Auth.updateUserAttributes()会强制登出吗?
    这个行为不正常。Auth.updateUserAttributes()的设计目标是更新用户属性,官方文档未提及该方法会主动清空认证令牌或触发登出操作,因此这属于异常情况。

  2. 若正常,有无避免强制登出的方法?
    由于该行为属于异常,此场景不适用。但如果是特殊场景下(比如更新敏感属性后Cognito强制刷新令牌),可以尝试在更新属性后手动重新获取用户会话:

const result = await Auth.updateUserAttributes(user, {
    'custom:attributes_1': '123456789',
});
// 更新后重新获取用户会话,恢复令牌
await Auth.currentAuthenticatedUser({ bypassCache: true });
  1. 若异常,代码/配置或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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:42:24