9

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

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

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

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

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

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

4

3 回答 3

7

您的时机无可挑剔:就在昨天,新版本的 SDK 发布了,支持唯一的永久用户 ID。它们符合您指定的所有标准。

于 2009-04-23T07:15:00.677 回答
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不是随机函数,但对于给定的数据返回的结果始终相同,但事实证明它实际上是不可逆的,因此您可以安全地在网站上显示散列密钥,而不会影响用户的电子邮件地址。此外,您可以放心地假设不同电子邮件的两个哈希值不会相同(它们可以相同,但发生的概率非常非常小)。有关散列函数的更多信息,请参阅Wikipedia 条目

于 2009-04-22T22:56:35.600 回答
1

你的意思是会话 cookie吗?

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


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

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

您最终会得到一个类似于 Google Docs 密钥的令牌,基本上是证明用户已通过身份验证的签名,无需接触数据库即可对其进行验证。

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

于 2009-04-22T20:21:23.900 回答