【问题标题】:How can I determine a user_id based on an email address in App Engine?如何根据 App Engine 中的电子邮件地址确定 user_id?
【发布时间】:2016-12-05 08:31:17
【问题描述】:

最新的 App Engine SDK (1.2.1) 有一个 API 调用,用于根据用户的电子邮件地址计算用户帐户的 ID。 (即使用户稍后更改地址,ID 也保持不变。)请参阅此question about unique, opaque user IDs 了解信息。但是,这个 API 调用有问题。

user_id() 适用于登录用户(即来自users.get_current_user),但它为users.User() 构造函数创建的对象返回None。** 提供了什么?

例如使用优秀的App Engine Console,这段代码不起作用

>>> import google.appengine.api.users
>>> me = google.appengine.api.users.get_current_user()
>>> me
users.User(email='jason.h.smith@gmail.com',_user_id='105261964646342707921')
>>> me.user_id()
'105261964646342707921'
>>> somebody = google.appengine.api.users.User('someone@gmail.com')
>>> somebody
users.User(email='someone@gmail.com')
>>>somebody.user_id()
>>> type(somebody.user_id())
<type 'NoneType'>

我想要一种将电子邮件地址转换为用户 ID 的简单方法。 如何提前从 Google 强制获取此 ID;或者如果不可能,为什么不呢?

编辑:这是当前的解决方法。

感谢尼克约翰逊的回答。这是他的实际解决方案:

>>> from google.appengine.ext import db
>>> from google.appengine.api import users
>>> class User(db.Model):
...   user = db.UserProperty(required=True)
...
>>> def email_to_userid(address):
...   """Return a stable user_id string based on an email address, or None if
...   the address is not a valid/existing google account."""
...   u = users.User(address)
...   key = User(user=u).put()
...   obj = User.get(key)
...   return obj.user.user_id()
>>> email_to_userid('jason.h.smith@gmail.com')
u'105261964646342707921'
>>> email_to_userid('this@is-an-invalid-email-address')
>>> email_to_userid('this@is-an-invalid-email-address') is None
True

【问题讨论】:

  • 您可能需要补充一点,如果给定电子邮件地址没有 Google 帐户,则不会返回任何用户 ID。
  • 不应该在流程结束时删除实体吗?
  • 这对我不起作用。也许它不适用于ndb?
  • 我确认这适用于 db,但不适用于 ndb。
  • 它可能不适用于ndb,因为ndb 对象被缓存在内存缓存中,所以.get 的对象不是来自数据存储区。

标签: google-app-engine email user-identification


【解决方案1】:

当前的解决方法是创建一个用户对象,将其存储到数据存储区,然后再次获取它。如果电子邮件对应于有效的 Google 帐户,则返回实体中的 User 对象将填充其 user_id 字段。

【讨论】:

  • 谢谢。我现在正在测试这个,如果它有效,我会投票并接受你的回答。
  • +1,它有效。我将在编辑后的问题中放置一些示例代码,因此希望这个问题可以成为如何将电子邮件地址转换为用户 ID 的规范答案。
  • 我想为 Android 做同样的事情。 . . Anybudy 请帮帮我。 . .提前致谢。 . .
  • 嗨尼克,我很困惑,如果我是愚蠢的,请道歉。您是说上述解决方法是说它提供了一种以编程方式测试提供的电子邮件地址是否与有效的 Gmail 帐户相关联的方法 - 因为这是我的合法用例。但是,首先我无法使用 Java 让它工作。其次,它似乎与这个答案相矛盾,这意味着故意不支持这种测试:stackoverflow.com/questions/13313877/…
  • 好的,现在可以工作了,所以我想这是可能的。谢谢!
【解决方案2】:

要使建议的解决方案与 NDB 一起使用,只需将 use_cache=False, use_memcache=False 添加到 get 方法。那是: obj = key.get(use_cache=False, use_memcache=False) 这保证了从 Datastore 中获取填充了 user_id 参数的实体(仅当这是一个有效的 Google 帐户时)。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2011-03-21
    • 1970-01-01
    • 2017-07-23
    • 2023-04-05
    • 2010-12-22
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多