【问题标题】:Generate unique Long Id on App Engine在 App Engine 上生成唯一的 Long Id
【发布时间】:2015-05-31 21:41:27
【问题描述】:

用户可以通过三种方式登录我们的服务:

  • 登录名和密码
  • 谷歌+
  • 脸书

我想将所有这些用户 ID 保存在一个实体中。为了避免 id 之间的冲突,例如Google 和 Facebook 会为 id 添加前缀(分别为g-f-)。目前,对于使用标准登录的用户,App Engine 会生成一个唯一的 Long 值(使用 Objectify 将 @Id Long 值设置为 null 作为 id)。

要将所有内容保存在一个实体中,键的类型必须相同,应为String。 Objectify 中没有为String 自动生成密钥的选项。

我需要为给定的实体生成唯一的Long 值,该值将以c-(自定义登录)为前缀。这会给String id 类似于谷歌和Facebook 的id。我搜索了 Objectify 的代码,但没有发现与为 null Long 注释为 @Id 的字段生成唯一的 Long id 相关。

【问题讨论】:

  • 如果是不同的域,如果它们有 id 冲突又何必呢?如果它是同一个域 - 您将获得 uniq id,只需将用户类型输入某个字段

标签: google-app-engine objectify google-cloud-datastore


【解决方案1】:

如果您想要一个与自动生成的 id 等效的值,请调用:

factory().allocateId(Thing.class).getId();

或者,您可以在底层 API 的底层 DatastoreService 上使用 allocateIds 方法。甚至UUID.randomUUID()

但是,这听起来很奇怪。通常,您希望能够从 Facebook id 或 Google id 映射到您的 Human 对象。我个人使用查找实体 - FacebookIdGoogleId 执行此操作,其字符串 id 是 FB 或 G 分发的确切 id。这不应该是合成键,否则您将如何查找?

【讨论】:

  • 我有用于登录 + 通行证和 Facebook 身份验证类型的自定义身份验证器。客户端实现使用标头将身份验证令牌传递给后端。一个带有授权:自定义 [token] 标头,另一个带有授权:Facebook [token]。我还有 TokenRecord 实体,它将令牌映射到 ClientRecord(它扩展了 User 类)。如果令牌无效,我将使用 Id 来区分用户并更新他们的令牌。对于 Google 身份验证,我使用了稍微修改的 GoogleOAuth2Authenticator,它将 Google id 直接映射到 ClientRecord。你觉得这种做法也正确吗?
  • 我没有完全理解,但在数据存储中记录授权令牌(而不是 id)很奇怪。从谷歌我将 openidconnect id_token 传递给服务器并在那里解码/验证它,这给了我一个合法的用户 ID。我敢肯定 Facebook 也有类似的东西。
  • 我有自定义登录并通过身份验证。当一个授权时,用户将获得生成的令牌和刷新令牌。我需要将这些令牌保存在某个地方,并能够将每个令牌映射到用户(并检查其有效性)。当然对于 Facebook,我可以使用他们的 API 来验证令牌,但我想缓存它。它允许我减少对 Facebook API 的调用量。您认为这是正确的设计还是我应该使用其他方法?也许是一些身份验证框架?
  • 您能看一下我之前的评论吗?简而言之,我必须将生成的令牌保存在数据存储中,因为我是颁发令牌的人并且必须检查它们的有效性。
  • 如果您想长期访问第三方内容,您需要保留刷新令牌。短期访问是一个更复杂的问题。也许您想创建一个新的 stackoverflow 问题?
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 2011-07-15
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多