【问题标题】:Should I use AWS Cognito "username" or "sub" (uid) for storing in database?我应该使用 AWS Cognito“用户名”还是“子”(uid) 来存储在数据库中?
【发布时间】:2017-01-06 11:51:18
【问题描述】:

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

但我也读到 article 并且作者说“始终生成关于 'sub' 声明值而不是 'username' 的策略,因为用户名是可重新分配的。Sub 是永远不会重新分配给另一个用户的 UUID用户。”

所以,现在我在犹豫必须使用什么作为唯一用户标识符 - “用户名”或“子”

谢谢。

【问题讨论】:

  • “子”是什么意思?
  • ok,sub 是 JWT 令牌中的一个参数。问题是用户 uuid 在哪里使用?

标签: amazon-web-services amazon-cognito


【解决方案1】:

如果您只想存储一个,由于您提供的原因,sub 可能是要走的路。

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

【讨论】:

    【解决方案2】:

    2021 年更新

    这两种选择都可以。

    但请记住,如果用户名 erlich.bachman 的用户删除了他的帐户,新用户以后可以使用相同的用户名,那么您的映射就会出错...

    用户名是注册用户的必填项,用户创建后不能更改。

    然而

    用户名在用户池中必须是唯一的。用户名可以重复使用,但必须在删除且不再使用后才能使用。

    子作为 id

    您可以在数据库中使用sub 作为ID 和username 作为属性。这将允许您通过他/她的usernameAdminGetUser 获取用户。但也为了避免任何数据丢失,正如@willscripted 在评论中提到的那样。

    引用 sub 可能会导致数据丢失并导致迁移困难 或恢复用户池。由于 sub 是全局唯一的,因此任何恢复的用户 数据将有新的子值。这将意味着重新键入您的应用程序 具有新子键的数据库,而如果您使用了用户名,则 可以按预期恢复您的池。 @willscripted

    用户名作为id

    如果您更喜欢直接使用 username 作为 id,您可以在用户帐户被删除时从数据库中删除该用户,或者使用“预注册”触发器来阻止用户使用 @ 987654327@ 已在数据库中。

    【讨论】:

    • 您如何看待使用电子邮件作为数据库中用户的 ID?
    • 这不是一个好主意,因为用户可以更改他/她的电子邮件。
    • 如果用户在 Facebook 上更改了电子邮件 - 如果用户使用 Facebook 登录,它将在用户池中自动更改?
    • 引用 sub 有数据丢失的风险,并且可能使迁移或恢复用户池变得困难。由于sub 是全局唯一的,任何恢复的用户数据都将具有新的sub 值。这意味着使用新的 sub 密钥重新为您的应用程序数据库设置密钥,而如果您使用了 username,您可以按预期恢复您的池。
    • 如果是首选方式,为什么 AWS Cognito 开发人员不让通过 sub 轻松检索用户?
    【解决方案3】:

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

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

    【讨论】:

    • 更新:截至目前,ListUser 支持通过sub 进行过滤,但是 Cognito 用户池控制台尚未更新以允许您这样做,因此只能通过 API 和 CLI 使用.
    【解决方案4】:

    参考 username.

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

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

    为什么不引用sub

    sub 无法从备份中恢复。

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

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

    全局唯一标识符是一种很好的做法。在安全上下文中使用可预测或完全可设置的标识符是几种常见攻击模式的基础。请参阅CAPEC-21: Exploitation of Trusted IdentifiersCAPEC-60: Reusing Session IDs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2021-04-17
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多