我正试图了解使用多种身份验证方法的登录模型。
1。)例如,当新用户尝试使用OpenID登录时,我的后端将在数据存储区中插入两个实体:
插入新用户,其中自动插入的ID将是他的$ userId
(kind: User, id: autoId)
插入链接到$ userId
的新登录信息 (kind: AuthOpenid, name: $openId), Property(userId: $userId)
这将允许我在用户尝试登录时按键请求进行查找,这会强制执行强一致的数据,对吗?
这个想法是一个用户可以有很多登录(比如stackexchange),我不必担心写入/读取限制,因为没有实体拥有祖先,同时仍然强制执行一致性。
2.。)在相关说明中:假设我的用户在提供身份验证方法后可以选择用户名,我该如何有效地检查是否使用了用户名?
我的想法是为每个选择的用户名插入一个新实体。
插入新用户名
(kind: Username, name: $username)
现在我可以通过键请求进行查找,看看是否采用了用户名。据我所知,常见的查找无论如何都会存储在memcache中,所以这应该是有效的,对吗?
我也可以撤销该程序,只是尝试插入一个用户名,看看它是否失败。
答案 0 :(得分:1)
1)你的方法看起来不错。如您所述,Lookup
操作(按键查找)为guaranteed to return consistent results。
你也是正确的,通过将每个AuthOpenid实体放在它自己的实体组(没有共同的祖先)中,你将避免任何特定实体组的1 write/second写入吞吐量限制(对比率没有相应的限制)实体组创建)。
2)这也可以,但是你需要在事务中执行读写操作。这可以确保如果两个用户尝试保留相同的用户名,则只有其中一个用户会成功。
在云数据存储区中,如果已存在具有相同密钥的实体,则insert
突变将失败,因此这也将起作用。
(请注意,这与使用upsert语义的App Engine数据存储区中的put()
操作不同。)