代码之家  ›  专栏  ›  技术社区  ›  Ori Pessach

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

  •  9
  • Ori Pessach  · 技术社区  · 15 年前

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

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

    给定一个App Engine用户对象,有没有一种方法可以获取该对象的唯一标识符,并以这种方式使用?

    我正在寻找Python解决方案——我忘了GAE现在也支持Java。尽管如此,我还是希望无论使用哪种语言,技术都是相似的。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Nick Johnson    15 年前

    unique, permanent user IDs . 它们符合您指定的所有标准。

        2
  •  3
  •   Dzinx    15 年前

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

    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 .

        3
  •  1
  •   Mark    15 年前

    你是说 session cookies

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


    詹克斯说了什么。创建无需数据库往返即可进行身份验证的不透明密钥的唯一方法是使用加密或加密哈希。

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

    然而,考虑到GAE的定价和bigtable的速度,如果你真的不能使用Google自己的身份验证,那么最好使用会话ID。