2015-12-10 1 views
-1

Я действительно смущен, как работает функция get_current_user() Google App Engine. Я просмотрел интернет по множеству различных руководств и руководств по логину и аутентификации, и многие из них упоминают похожие методы.Как работает get_current_user

Если в мое приложение одновременно входит один миллион пользователей, как этот способ может работать? Каждый пользователь получает свой собственный экземпляр сервера? Как сервер знает, с каким клиентом он разговаривает?

Это не имеет для меня никакого смысла.

+0

Вау, почему нисходящий? Если у меня проблема, и я не могу найти ответ, могу ли я не зайти на этот сайт за помощью? Разве это не вся причина, почему этот сайт существует? – bgenchel

ответ

1

При входе в систему (путем нажатия на URL-адрес, генерируемый create_login_url()), cookie, содержащий идентифицирующую информацию пользователя, готовят и нажимают на стороне клиента, а затем используются в последующих запросах до тех пор, пока пользователь не выйдет из системы или срок действия файла cookie не истечет. Вызов get_current_user() просто проверяет наличие/информацию о файлах cookie и отвечает соответственно.

На сервере разработки файл cookie имеет имя dev_appserver_login. Я больше не могу проверять имя файла cookie в GAE, поскольку я перешел от API-интерфейсов пользователей.

Фактическая обработка печенья, кажется, происходит где-то на внутреннем интерфейсе сервиса пользователей, например, глядя на google/appengine/api/users.py файл в питона 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) 
+0

Откуда у него куки? Куки-файлы хранятся на стороне клиента, но, насколько я вижу, в коде не анализируется. – bgenchel

+0

Я обновил ответ. Я не знаю точно, где реализация API проверяет куки-файл, на некоторых бэкэндах не может быть хепирование, которое прямо не видно в коде API. –