Cognito 用户池中的自定义属性是否适合存储动态用户信息?

oso*_*rio 6 amazon-web-services amazon-cognito serverless

Cognito 的 AWS 文档说道:

每个自定义属性: 一旦添加到用户池,就无法删除或更改。

来自:https: //docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-custom-attributes

我相信他们指的是自定义属性的名称,而不是值本身。

因此,例如可以通过 Lambda 函数更改该值。假设我们在电子商务网站中存储每个用户的保真度积分。

自定义属性是否适合存储此类信息?或者我应该创建一个链接到用户池中的 UserId 的新 DynamoDB 表?

Bri*_*ant 10

您当然可以将此信息存储在 Cognito 自定义属性中。如果你这样做,我会考虑两件事:

1) 确保用于对用户池进行身份验证的 Cognito 用户池客户端没有写入此属性的权限。否则,恶意用户可以编写代码来根据用户池对自己进行身份验证,并为自己提供所需的尽可能多的保真度点。因此,您可能需要考虑将自定义属性更新隐藏在服务后面。

2) 根据您需要更新此属性的频率以及您的整体 Cognito 使用模式,您在使用 Cognito updateAttributes API 时可能会遇到 RequestLimitExceeded 错误。几乎每次我尝试使用 Cognito 作为用户信息的主要数据存储时,我都会受到限制。AWS 支持会提高您的限制,但错误会在没有警告的情况下发生,这在生产环境中不太好。我总是最终默认使用 DynamoDB 表。当然这只是我的经历所以YMMV


Cri*_*eda 0

在我看来,如果您需要属性值出现在身份令牌上,您应该使用自定义属性,如果不需要,最好将其存储在其他位置。

示例:您的“用户”是“页面”的管理员,然后您将该关系存储在自定义属性上。Cognito 将该信息添加到身份令牌中,然后当用户对“页面”进行 api 调用时,您只需要信任令牌中的信息,而不需要进行额外的数据库调用来检查用户是否与该页面相关。

正如文档所述,自定义属性非常严格

您最多可以向用户池添加 50 个自定义属性。您可以指定自定义属性的最小和/或最大长度。但是,任何自定义属性的最大长度不能超过 2048 个字符。

每个自定义属性:

可以定义为字符串或数字。

不能要求。

添加到用户池后就无法删除或更改。

名称的字符长度可以在 Amazon Cognito 接受的限制范围内。有关更多信息,请参阅 Amazon Cognito 中的配额。

如果您不需要令牌上的 attrib,我更喜欢使用 dynameDB,限制要少得多。