Cognito 的 AWS 文档说:
每个自定义属性:一旦添加到用户池,就无法删除或更改。
我相信他们指的是自定义属性的名称,而不是值本身。
因此,例如,可以从 Lambda 函数更改该值。假设我们为电子商务网站中的每个用户存储保真度积分。
自定义属性是否适合存储此类信息?还是应该在用户池中创建一个链接到 UserId 的新 DynamoDB 表?
Cognito 的 AWS 文档说:
每个自定义属性:一旦添加到用户池,就无法删除或更改。
我相信他们指的是自定义属性的名称,而不是值本身。
因此,例如,可以从 Lambda 函数更改该值。假设我们为电子商务网站中的每个用户存储保真度积分。
自定义属性是否适合存储此类信息?还是应该在用户池中创建一个链接到 UserId 的新 DynamoDB 表?
您当然可以将此信息存储在 Cognito 自定义属性中。如果你这样做,我会考虑两件事:
1) 确保用于对用户池进行身份验证的 Cognito 用户池客户端无权写入此属性。否则,流氓用户可以编写代码来根据用户池对自己进行身份验证,并根据需要为自己提供尽可能多的保真度点。因此,您可能需要考虑将自定义属性更新隐藏在服务后面。
2) 根据您需要更新此属性的频率以及您的整体 Cognito 使用模式,您在使用 Cognito updateAttributes API 时可能会遇到 RequestLimitExceeded 错误。几乎每次我尝试使用 Cognito 作为用户信息的主要数据存储时,我都会受到限制。AWS 支持会提高您的限制,但错误会在没有警告的情况下发生,这在生产环境中并不是很好。我总是默认使用 DynamoDB 表。当然这只是我的经验,所以 YMMV
在我看来,如果您需要属性值出现在身份令牌上,您应该使用自定义属性,否则最好将其存储在另一个地方。
示例:您的“用户”是“页面”的管理员,然后您将这种关系存储在自定义属性中。Cognito 将该信息添加到身份令牌中,然后当用户对“页面”进行 api 调用时,您只需要信任令牌中的信息,而不需要进行额外的数据库调用来检查用户是否与该页面相关。
正如文档所述,自定义属性非常严格:
您最多可以向用户池添加 50 个自定义属性。您可以为自定义属性指定最小和/或最大长度。但是,任何自定义属性的最大长度不能超过 2048 个字符。
每个自定义属性:
可以定义为字符串或数字。
不能要求。
一旦添加到用户池中,就无法删除或更改。
名称的字符长度可以在 Amazon Cognito 接受的限制范围内。有关更多信息,请参阅 Amazon Cognito 中的配额。
如果您不需要令牌上的属性,我更喜欢使用 dynameDB,限制少得多。