如何让AWS Cognito用户池的用户属性可通过AWS Amplify更新?
问题原因排查及解决办法
最常见原因:用户池级别的属性可编辑权限未开启
Cognito的属性修改权限分为两层,你配置的客户端WriteAttributes只是第二层权限,第一层是用户池本身的属性是否允许编辑,这是很多开发者容易遗漏的配置:
- 进入Cognito控制台对应用户池的「属性」标签页,找到标准属性中的
nickname,确认右侧的可编辑开关处于开启状态 - 如果你是通过SAM模板部署的用户池,需要检查
AWS::Cognito::UserPool资源的Schema配置中,nickname的Mutable属性是否设为true,配置示例如下:
MyCognitoUserPool: Type: AWS::Cognito::UserPool Properties: Schema: - Name: nickname Mutable: true AttributeDataType: String # 其他可选配置
如果Mutable设为false,无论客户端配置的写属性是什么,该属性都无法修改。
其他可能原因及排查方案
- 确认Amplify使用的客户端ID与配置了
WriteAttributes的客户端一致:
检查项目根目录下aws-exports.js中的aws_user_pools_web_client_id值,和Cognito控制台「应用程序集成」-「应用程序客户端列表」中对应客户端的ID完全匹配,再进入该客户端详情页,确认「应用程序客户端写属性」中确实勾选了nickname - 刷新用户认证令牌后重试:
若用户登录态已经过期,令牌携带的权限信息可能有误,可以先登出重登,或者修改代码先刷新会话再执行更新操作,修改后的代码示例:
try { // 先刷新会话,确保令牌权限有效 await Auth.currentSession(); const user = await Auth.currentAuthenticatedUser(); await Auth.updateUserAttributes(user, { 'nickname': 'newtestname' }); } catch (error) { console.log(error); }
注意:如果是修改自定义用户属性,属性名需要加
custom:前缀,例如custom:nickname,标准属性不需要加此前缀,你的代码中属性名写法正确。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

