我应该使用AWS Cognito"username"或"sub"(uid)存储在数据库中吗?

lex*_*exa 15 amazon-web-services amazon-cognito

我在AWS Cognito服务中有一个经过身份验证的用户,并希望将其唯一标识符存储在数据库中.我应该存储用户的用户名(这是他的电话号码)还是他的"子"(这是他的uid)?所有Amazon API函数(如AdminGetUser)都使用"username"参数,但不使用sub/uid.

但我也读过那篇文章,作者说"总是生成关于'sub'声明的价值的政策,而不是'用户名',因为用户名是可重新分配的.Sub是用户的UUID,永远不会被重新分配给另一个用户."

所以,现在我犹豫了我必须用作唯一用户标识符 - "username"或"sub"

谢谢.

use*_*828 12

您应该使用该sub属性.事实上,如果使用用户名的用户Erico删除了他的帐户,则新用户可以稍后使用此相同的用户名,并且您的映射将是错误的...

注册用户始终需要用户名,并且在创建用户后无法更改用户名.

然而

用户名必须在用户池中是唯一的.用户名可以重复使用,但只有在删除后才会被使用.

更新

您可以在数据库中使用subas ID和usernameas属性.这将允许你通过他/她得到用户usernameAdminGetUser.

如果您确实需要username数据库中的as ID,则可以在删除其帐户时从数据库中删除该用户,或使用"Pre Sign-up"触发器来阻止用户使用username数据库中已存在的用户.

  • 引用“sub”可能会导致数据丢失,并且可能导致迁移或恢复用户池变得困难。由于“sub”是全局唯一的,任何恢复的用户数据都将具有新的“sub”值。这意味着使用新的“子”密钥重新键入您的应用程序数据库,而如果您使用了“用户名”,则可以按预期恢复您的池。 (4认同)
  • 这不是一个好主意,因为用户可以更改他/她的电子邮件。 (2认同)

use*_*753 10

Cognito当前的限制之一(到目前为止)是列出用户,如果您将其保存sub在自己的数据库中以识别您的用户,然后您尝试从 Cognito 恢复此已保存用户的信息是不可能的,因为 aws不会t 允许按子属性或自定义属性过滤,因此username用于保存 uuid 并prefered_username作为真实用户名的别名。

在 javascript AWS.CognitoIdentityServiceProvider.ListUser 中,其他人也一样。

  • 更新:截至目前,ListUser 支持通过 ```sub``` 进行过滤,但是 Cognito 用户池控制台尚未更新以允许您这样做,因此它只能通过 API 和 CLI 使用。 (15认同)

wil*_*-ob 7

参考 username

  • sub: 全局唯一标识符,由 aws 设置
  • subject: 用户标识符,由您设置

您想要一个全局唯一标识符,但您想自己设置它。

为什么不参考sub

sub 无法从备份中恢复。

在撰写本文时,Cognito 没有本机备份解决方案。如果您误删,您必须有自己的备份数据。由于sub不是可设置的字段,您的用户身份将不再与其以前的任意sub值相关联。

为什么设置subject为全局唯一标识符?

全局唯一标识符是一种很好的做法。在安全上下文中使用可预测或完全可设置的标识符是几种常见攻击模式的基础。请参阅CAPEC-21:可信标识符的利用CAPEC-60:重用会话 ID

编辑。如果您相信亚马逊的系统会保持诚实sub,您甚至可以将其用作您的全球唯一username标识符。


Jef*_*ley 1

如果您只想存储一个,那么由于您提供的原因,子系统可能是最佳选择。

这很大程度上取决于您的用例,但如果您需要使用此数据库来调用像您的示例一样的 API,那么跟踪两者/两者之间的映射是一个完全有效的解决方案。