我真的很困惑 Google App Engine 的用户 get_current_user() 是如何工作的。我在互联网上浏览了许多有关登录和身份验证的不同指南和教程,其中许多都提到了类似的方法。
如果有 100 万用户同时登录到我的应用程序,那么这种方法怎么可能起作用?每个用户都有自己的服务器实例吗?服务器如何知道它正在与哪个客户端通信?
这对我来说根本没有意义。
我真的很困惑 Google App Engine 的用户 get_current_user() 是如何工作的。我在互联网上浏览了许多有关登录和身份验证的不同指南和教程,其中许多都提到了类似的方法。
如果有 100 万用户同时登录到我的应用程序,那么这种方法怎么可能起作用?每个用户都有自己的服务器实例吗?服务器如何知道它正在与哪个客户端通信?
这对我来说根本没有意义。
登录时(通过单击生成的 URL create_login_url()
),会准备一个包含用户识别信息的 cookie,并将其推送到客户端,然后在后续请求中使用,直到用户注销或 cookie 过期。调用get_current_user()
只是检查 cookie 的存在/信息并做出相应的响应。
在开发服务器上,cookie 被命名为dev_appserver_login
。当我离开用户 API 时,我无法再检查 GAE 上的 cookie 名称。
cookie 的实际处理似乎发生在用户服务后端的某个地方,例如,通过查看google/appengine/api/users.py
python SDK 中的文件:
def create_login_url(dest_url=None, _auth_domain=None,
federated_identity=None):
...
req = user_service_pb.CreateLoginURLRequest()
resp = user_service_pb.CreateLoginURLResponse()
try:
apiproxy_stub_map.MakeSyncCall('user', 'CreateLoginURL', req, resp)
...
终点(至少对于开发服务器)似乎以某种方式降落在某个地方google/appengine/tools/appengine_rpc.py
,例如:
@staticmethod
def _CreateDevAppServerCookieData(email, admin):
"""Creates cookie payload data.
Args:
email: The user's email address.
admin: True if the user is an admin; False otherwise.
Returns:
String containing the cookie payload.
"""
if email:
user_id_digest = hashlib.md5(email.lower()).digest()
user_id = "1" + "".join(["%02d" % ord(x) for x in user_id_digest])[:20]
else:
user_id = ""
return "%s:%s:%s" % (email, bool(admin), user_id)
def _DevAppServerAuthenticate(self):
"""Authenticates the user on the dev_appserver."""
credentials = self.auth_function()
value = self._CreateDevAppServerCookieData(credentials[0], True)
self.extra_headers["Cookie"] = ('dev_appserver_login="%s"; Path=/;' % value)