gpt4 book ai didi

python - 检索 Google 用户对象的 ID 值

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:12 25 4
gpt4 key购买 nike

我一直很困惑。我一直在使用 Google 的 User 对象,可以在此处找到:

https://cloud.google.com/appengine/docs/python/refdocs/google.appengine.api.users#google.appengine.api.users.User

阅读了一些资源后,我被告知存储 User 对象本身并不是一个好主意,因为电子邮件可能会发生变化。 Google 建议您存储 User_Id 本身,因为这样做始终安全(即,它始终保持静态)。

当我获取当前用户并尝试使用用户对象上的 user_id() 方法获取 User_Id 值时,我得到一个 None 值响应。

current_user = endpoints.get_current_user()
print current_user.user_id()
>> None

但是,如果我将 current_user 保存为 NDB 中的 UserProperty,然后检索相同的值,我确实会得到 user_id。例如:

google_user = ndb.UserProperty(required = True)

print google_user.user_id()
>> 12345678901234567890

Google 用户对象应该如何处理?更重要的是,为什么在 NDB 保存该值之前 user_id 值是 None ?这是一种帐户/电子邮件验证吗?

您可以在此处找到 Google 的建议:

https://cloud.google.com/appengine/docs/python/users/userobjects

“我们强烈建议您不要存储 UserProperty,因为它包含电子邮件地址以及用户的唯一 ID。如果用户更改了其电子邮件地址,并且您将其旧的、存储的 User 与新的 User 值进行比较,他们会发现将不匹配。相反,请考虑使用 User 用户 ID 值作为用户的稳定唯一标识符。”

编辑:我应该提到,我正在 localhost 上进行测试。部署应用程序时,endpoints.get_current_user() 的处理方式是否有所不同?

这是 Google 使用的示例:

class ModelWithUser(ndb.Model):
user_id = ndb.StringProperty()
color = ndb.StringProperty()

@classmethod
def get_by_user(cls, user):
return cls.query().filter(cls.user_id == user.user_id()).get()

如果我通过当前经过身份验证的用户(我无权访问)的 user_id 查询 ModelWithUser,我该如何从 ModelWithUser< 获取用户?嘎嘎。

最佳答案

好吧,在通过 Google 搜索进行挖掘之后,我发现了这个线程,涉及如何在不访问数据存储的情况下获取当前用户 ID:

https://code.google.com/p/googleappengine/issues/detail?id=8848

Google 的官方回应是,这是已知问题,不会得到修复:

“解决此问题不在我们的路线图上 - Google ID token 包含 G+ 用户 ID,而不是 App Engine 用户 ID,因此提供的 App Engine 用户对象不能包含 App Engine 用户 ID。我们建议您使用其中之一上述解决方法。”

解决方法如下(来自 Google 开发人员):https://code.google.com/p/googleappengine/issues/detail?id=8848#c39

def _getUserId():
"""A workaround implementation for getting userid."""
auth = os.getenv('HTTP_AUTHORIZATION')
bearer, token = auth.split()
token_type = 'id_token'
if 'OAUTH_USER_ID' in os.environ:
token_type = 'access_token'
url = ('https://www.googleapis.com/oauth2/v1/tokeninfo?%s=%s'
% (token_type, token))
user = {}
wait = 1
for i in range(3):
resp = urlfetch.fetch(url)
if resp.status_code == 200:
user = json.loads(resp.content)
break
elif resp.status_code == 400 and 'invalid_token' in resp.content:
url = ('https://www.googleapis.com/oauth2/v1/tokeninfo?%s=%s'
% ('access_token', token))
else:
time.sleep(wait)
wait = wait + i
return user.get('user_id', '')

尽管我很喜欢在 Google 的堆栈中工作,但我承认 - 这很奇怪。

编辑:

可以在这里找到另一个解决方法:

How can I determine a user_id based on an email address in App Engine?

关于python - 检索 Google 用户对象的 ID 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40748125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com