繁体   English   中英

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

[英]Generating unique and opaque user IDs in Google App Engine

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

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

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

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

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

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

您的时间安排无可挑剔:就在昨天,SDK的新版本问世,支持独特的永久用户ID 它们符合您指定的所有标准。

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

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条目

你的意思是会话饼干

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


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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM