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

如何解决Auth.completeNewPassword设置自定义属性custom:role时的非可写属性错误?

解决Cognito completeNewPassword设置custom:role报错的问题

这个Input attributes include non-writable attributes报错的核心原因很明确:你尝试通过客户端修改的custom:role属性,要么没有在Cognito用户池里开启客户端可写权限,要么没把它加入应用客户端的允许修改属性列表。下面一步步给你解决办法:

第一步:检查并配置Cognito用户池的自定义属性

  • 登录AWS控制台,打开你的Cognito用户池
  • 切换到「属性」标签页,找到你创建的custom:role自定义属性:
    • 确保它的「是否可写」选项是开启的(注意:自定义属性创建后无法修改可写性,如果之前没开,你需要删除后重新创建这个属性并勾选可写)
  • 切换到「应用集成」->「应用客户端」,找到你正在使用的客户端ID(报错里的XXXX):
    • 点击「编辑」,在「允许的属性」部分,找到custom:role并勾选它,保存配置

第二步:确认代码调用的正确性

如果已经完成上面的配置,你的代码本身是没问题的,但要注意几个细节:

  • 自定义属性的前缀必须是custom:,你已经正确使用了custom:role
  • 确保this.profileForm.get('newPassword')和其他属性值都不为空,空值也可能引发意外错误

修正后的代码(权限配置正确后即可运行):

Auth.completeNewPassword( user, this.profileForm.get('newPassword')?.value, { 
  "phone_number": String(this.profileForm.get('phone')?.value), 
  "given_name": this.profileForm.get('fName')?.value, 
  "family_name": this.profileForm.get('lName')?.value, 
  "locale": this.profileForm.get('language')?.value, 
  "custom:role": "user" 
} ) 
.then(data => console.log("Changed Password! -->", data)) 
.catch(err => console.log("Password change failed: ", err));

额外建议:敏感属性的安全设置

role这类涉及权限的属性,其实不建议让客户端直接设置——万一用户篡改这个值给自己提升权限就麻烦了。更安全的做法是:

  • 让custom:role只能由后端服务或者Cognito的Lambda触发器(比如Pre Sign-up或Post Authentication触发器)来设置
  • 如果是用户注册时分配角色,可以在Pre Sign-up触发器里根据业务逻辑自动赋值;如果是后续修改,通过后端调用Cognito的AdminUpdateUserAttributes API来操作,这样能完全控制权限

内容的提问来源于stack exchange,提问作者zer0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:52:34