如何解决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的AdminUpdateUserAttributesAPI来操作,这样能完全控制权限
内容的提问来源于stack exchange,提问作者zer0
相关产品推荐
相关产品推荐

