Amazon Cognito“客户端试图写入未经授权的属性”
Posted
技术标签:
【中文标题】Amazon Cognito“客户端试图写入未经授权的属性”【英文标题】:Amazon Cognito "A client attempted to write unauthorized attribute" 【发布时间】:2017-10-16 06:28:23 【问题描述】:我正在使用适用于 AWS Cognito 的 javascript 开发工具包,但有几个自定义属性我似乎无法保存,也看不出原因。
问题属性是可变字符串字段如下:
custom: role
custom: recruitingrole
custom: title
同一请求中的其他自定义字段似乎更新正常。具体来说,这些似乎有效:
custom:division
custom:linkedin
custom:location
custom:bio
当我通过 SDK 提交时,返回:
"__type":"NotAuthorizedException","message":"客户端试图写入未经授权的属性"
这是发送的数据,如 Chrome 开发者控制台网络输出所示:
"AccessToken": "",
"UserAttributes": [
"Name": "name",
"Value": "Steve Austin"
,
"Name": "custom:company",
"Value": "OSI"
,
"Name": "custom:division",
"Value": "Bionics"
,
"Name": "custom:recruitingrole",
"Value": "other"
,
"Name": "custom:linkedin",
"Value": "http://www.linkedin.com"
,
"Name": "custom:location",
"Value": "Mexico City, Mexico City, Mexico"
,
"Name": "custom:bio",
"Value": "A man barely alive."
]
谁能建议我为什么不能保存到这些属性?
谢谢
【问题讨论】:
【参考方案1】:当然,当我在 *** 上发帖后,答案就很清楚了。
问题是我没有在与用户池关联的应用程序中为这些属性设置权限。文档应在讨论自定义属性的地方明确说明此要求。
【讨论】:
很高兴看到您找到了问题的答案。此功能的文档在这里:docs.aws.amazon.com/cognito/latest/developerguide/… 我可以看到它调用了属性的权限/范围,以及您收到的错误。如果您认为应该进行任何特定的编辑,或者可以添加一些内容以使其更有帮助/更易于阅读,我鼓励您使用页面右下角的按钮提交反馈。 :) @robDevereux 我按照你的建议做了,但一路上收到各种警告你的连接不安全 docs-feedback.aws.amazon.com 的所有者配置了他们的网站不正确。为保护您的信息不被窃取,Firefox 未连接到本网站。了解更多... 报告此类错误以帮助 Mozilla 识别和阻止恶意网站 上述文档仍然没有明确说明您可以在哪里设置属性权限。我发现它在常规设置 -> 应用程序客户端 -> 显示详细信息 -> 设置属性读写权限链接 我不清楚这些设置应该如何设置。我检查了每个框,但它仍然不起作用。 能否得到更详细的错误信息。比如,哪个属性导致了这个问题?【参考方案2】:只需突出显示answer from @mvandillen:
常规设置 -> 应用客户端 -> 显示详情 -> 设置属性读写权限链接
【讨论】:
这很有魅力!!谢谢【参考方案3】:对于任何偶然发现这个问题的人:
像其他人建议的那样,您应该启用可写属性。但如果这不起作用,请确保使用 custom:
前缀:
await Auth.signUp(
username: email,
password: password,
attributes:
'custom:firstName': firstName,
'custom:lastName': lastName,
'custom:countryCode': countryCode
)
【讨论】:
【参考方案4】:在 ASP.NET Core 中使用 Amazon.Extensions.CognitoAuthentication,您必须添加:
var user = _pool.GetUser(model.Email)
user.Attributes.Add("name", model.Name);
这里name
是自定义属性
【讨论】:
【参考方案5】:我的情况有点不同。我正在使用 Amplify angular 组件,并且没有任何自定义属性(标准电子邮件登录类型)。
事实证明,注册字段的键是区分大小写的。对于大写的“电子邮件”键,我会看到错误。 下面是注册配置
emailSignUpConfig =
header: 'Sign up header',
hideAllDefaults: true,
defaultCountryCode: '1',
signUpFields: [
label: 'Email',
key: 'email', //the email should be in lower case
required: true,
displayOrder: 1,
type: 'string',
,
label: 'Password',
key: 'password',
required: true,
displayOrder: 2,
type: 'password',
,
],
;
【讨论】:
【参考方案6】:启用可写属性后,这对我有用
const user =
username:this.username,
password:this.password,
attributes:
email:this.email,
'custom:field1': this.field1,
'custom:field2': this.field2,
'custom:field3': this.field3
OR
const user =
username:this.username,
password:this.password,
email:this.email,
attributes:
'custom:field1': this.field1,
'custom:field2': this.field2,
'custom:field3': this.field3
【讨论】:
【参考方案7】:我只想添加有关 android 和 Amplify 的 Auth 库的列表。除了通过 AWS 控制台(常规设置 -> 应用程序客户端 -> 显示详细信息 -> 设置属性读写权限链接)启用上面指定的自定义角色外,您还需要指定 AuthUserAttributeKey.custom()
下的自定义角色具有字符串 custom:
附加到您的自定义字段。我的假设是,鉴于函数调用名称,这将被排除在外。有点误导,但我希望这对其他人有帮助。
TLDR;
改变了这个:
AuthUserAttributeKey.custom("role");
到:
AuthUserAttributeKey.custom("custom:role");
【讨论】:
【参考方案8】:就我而言,问题在于访问名称不正确的变量。总结一下我的步骤如下。
添加属性:常规设置->属性->添加自定义属性链接
确保您设置读/写权限:常规设置 -> 应用客户端 -> 显示详细信息 -> 设置属性权限链接
不要忘记使用正确的名称访问您的变量。例如,如果您的变量名为 'foo',您应该将其作为 'custom:foo' 获取,如下所示。
【讨论】:
以上是关于Amazon Cognito“客户端试图写入未经授权的属性”的主要内容,如果未能解决你的问题,请参考以下文章
Angular + amazon-cognito-identity-js,为啥我收到错误:未定义全局
AWS Cognito:在 Auth.signIn 中出现错误(验证 amazon-cognito-identity-js 是不是已链接)
登录后具有 cognito 的 Amazon 负载均衡器返回 401