-1

我真的很困惑 Google App Engine 的用户 get_current_user() 是如何工作的。我在互联网上浏览了许多有关登录和身份验证的不同指南和教程,其中许多都提到了类似的方法。

如果有 100 万用户同时登录到我的应用程序,那么这种方法怎么可能起作用?每个用户都有自己的服务器实例吗?服务器如何知道它正在与哪个客户端通信?

这对我来说根本没有意义。

4

1 回答 1

1

登录时(通过单击生成的 URL create_login_url()),会准备一个包含用户识别信息的 cookie,并将其推送到客户端,然后在后续请求中使用,直到用户注销或 cookie 过期。调用get_current_user()只是检查 cookie 的存在/信息并做出相应的响应。

在开发服务器上,cookie 被命名为dev_appserver_login。当我离开用户 API 时,我无法再检查 GAE 上的 cookie 名称。

cookie 的实际处理似乎发生在用户服务后端的某个地方,例如,通过查看google/appengine/api/users.pypython 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)
于 2015-12-10T01:14:39.247 回答