GAE使用数据存储区

时间:2015-05-08 07:15:48

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

我正在为Android和iOS实现一个移动应用程序,我正在使用GAE和数据存储区作为我的应用程序的服务器端。我的应用使用facebook登录进行用户身份验证。该应用程序的一个关键方面是用户可以通过应用程序相互交互,但我想保持他们的实际facebook-id秘密,以便用户无法通过我的应用程序发现另一个用户的Facebook个人资料。

我最初的设计是使用MySQL,在那里我有一个带有表主键的用户表的简单实现,一个自动增量整数作为应用程序的用户ID。所以我可以安全地将其他用户的用户ID发送到客户端应用程序,这并没有泄露任何我不想泄露的信息。当用户登录时,客户端应用程序执行所有必要的facebook登录过程并将facebook访问令牌发送到服务器。如果具有此id的用户已经存在,服务器将从此令牌chech中提取facebook用户信息,如果是,则使用此用户行,否则创建一个新用户信息。

在SQL数据库上,这很有效,因为它非常一致,并且我无法“错过”用户已经在表中的事实。但是现在,当我使用具有相同想法的最终一致数据存储时,我遇到了一个问题,即如果用户第一次登录,则会向数据存储区添加一个条目,但如果用户稍后再次登录我正在执行的查询以检查具有相同facebook-id的“User”实体是否已经存在此查询有时仍然不返回任何结果。这导致同一个facebook id与我的应用程序的2个不同用户相关联,这显然很糟糕。

(我知道这似乎是不太可能的情况,但我在开发过程中偶然遇到了它)

我想到了一些缓解这个问题的方法:

  1. 不使用app用户ID作为实体键,而是使用facebook id,这样可以确保一致性(因为现在查找中没有索引)。这意味着我需要使用facebook id作为我的应用程序的ID,这违反了其中一个设计原则(其他用户的facebook id现在会泄露给客户端应用程序)。

  2. 不是依赖于数据存储区为用户生成的实体密钥ID,而是通过对facebook用户ID执行某种确定性操作来自己指定id,例如对其进行哈希处理或加密。这样我就可以使用密钥来执行查找,无论同一用户登录其用户ID的次数是多少,都会生成相同的内容。但这似乎是一种过于正确的方法。如果我散列它,我将需要确保使用良好的散列算法来防止冲突。一个好的哈希或加密会输出一个长字符串作为用户ID,这不是太糟糕,但我想尽可能将用户ID保持为一个简单的长整数值。

  3. 如果我们找到多个相应的实体,删除它们并保留一个实体,则在登录期间接受这一事实最终是一致的。这很糟糕,因为如果用户已经执行了一些存储在前一个实体上的操作呢?我将不得不浏览来自同一用户的多个用户实体的所有数据,并对它们执行某种合并操作。这还需要我运行存储用户ID的其他实体并将其全部更改。

  4. 使用memcache存储用户,这可能会使这种情况更不可能,但不能完全消除它。 Memcache条目可以过早地被驱逐,在这种情况下我们又回到了swaure。

  5. 这里最好的方法是什么?有什么我想念的吗?真的很适合你的意见。

0 个答案:

没有答案
相关问题