在Google App Engine中生成唯一且不透明的用户ID

时间:2009-04-22 20:06:22

标签: python google-app-engine guid uniqueidentifier

我正在开发一个允许注册用户创建或上传内容的应用程序,并允许匿名用户查看该内容并浏览注册用户的页面以查找该内容 - 这与Flickr等网站的方式非常相似例如,允许人们浏览其用户的页面。

为此,我需要一种方法来识别匿名HTTP GET请求中的用户。用户应该能够键入http://myapplication.com/browse/<userid>/<contentid>并进入正确的页面 - 应该是唯一的,但出于隐私原因,不得与用户的电子邮件地址类似。

通过Google App Engine,我可以获得与用户关联的电子邮件地址,但就像我说的那样,我不想使用它。我可以让我的应用程序的用户在注册时选择一个唯一的用户名,但我想尽可能选择,以便注册过程尽可能短。

另一种选择是在注册过程中生成一些随机cookie(一个GUID?),并使用它,我没有看到一种明显的方法来保证这种cookie的唯一性,而无需访问数据库。

在给定App Engine用户对象的情况下,是否有办法获取可以这种方式使用的该对象的唯一标识符?

我正在寻找一个Python解决方案 - 我忘了GAE现在也支持Java。不过,无论语言如何,我都希望这些技术是相似的。

3 个答案:

答案 0 :(得分:7)

您的时间安排无可挑剔:就在昨天,SDK的新版本发布了,支持unique, permanent user IDs。它们符合您指定的所有标准。

答案 1 :(得分:3)

我认为您应该区分两种类型的用户:

1)已通过Google帐户登录或已使用非Google电子邮件地址在您的网站上注册的用户

2)第一次打开您网站但未以任何方式登录的用户

对于第二种情况,除了生成一些随机字符串(例如,通过uuid.uuid4()或来自此用户的会话cookie密钥),我看不到其他方式,因为匿名用户不会自己携带任何唯一信息。

但是,对于已登录的用户,您已拥有唯一标识符 - 他们的电子邮件地址。我同意您的隐私问题 - 您不应将其用作标识符。相反,如何生成似乎随机的字符串,但实际上是从电子邮件地址生成的?哈希函数非常适合此目的。例如:

>>> import hashlib

>>> email = 'user@host.com'
>>> salt = 'SomeLongStringThatWillBeAppendedToEachEmail'

>>> key = hashlib.sha1('%s$%s' % (email, salt)).hexdigest()
>>> print key
f6cd3459f9a39c97635c652884b3e328f05be0f7

由于hashlib.sha1不是随机函数,但对于给定的数据返回总是相同的结果,但事实证明它实际上是不可逆的,您可以安全地在网站上显示散列密钥而不会影响用户的电子邮件地址。此外,您可以安全地假设没有两个不同的电子邮件的哈希值是相同的(它们可以,但它发生的可能性非常非常小)。有关散列函数的更多信息,请参阅the Wikipedia entry

答案 2 :(得分:1)

您的意思是session cookies吗?

尝试http://code.google.com/p/gaeutilities/


DzinX说的是什么。创建可以在没有数据库往返的情况下进行身份验证的不透明密钥的唯一方法是使用加密或加密哈希。

为用户提供一个随机数字并对其进行哈希处理或使用私钥对其进行加密。您仍然会遇到(微小的)碰撞风险,但您可以通过在创建密钥时触摸数据库来避免这种情况,并在发生冲突时更改随机数。确保随机数是加密的,并添加一个长的服务器端随机数,以防止选择的明文攻击。

您最终会得到一个像Google Docs密钥这样的令牌,基本上是一个证明用户经过身份验证的签名,可以在不触及数据库的情况下进行验证。

但是,考虑到GAE的定价和bigtable的速度,如果您真的无法使用Google自己的身份验证,那么最好使用会话ID。