проблема авторизации в facebook с tipfy 1.0b - PullRequest
5 голосов
/ 09 июня 2011

Я пытаюсь имитировать страницу входа из примера http://tipfy -auth.appspot.com (источник http://code.google.com/p/tipfy/source/browse/examples/auth/app/) без успеха. Кажется, я столкнулся с проблемой, когдапользователь перенаправлен обратно на страницу. Текущий поток запросов выглядит следующим образом:

LoginPage (LoginHandler) -> перенаправление Facebook (FacebookAuthHandler) 302 -> Facebook.com -> перенаправление Facebook (FacebookAuthHandler) 302 -> RegistrationPage (SignupHandler) 302 -> LoginPage (LoginHandler).

Проблема здесь (насколько я понял) - это последние 302 (http-redirect) от регистрации (должно бытьконечной точки) снова на страницу входа.

После некоторой интенсивной регистрации (не могу найти, чтобы проверить это локально), кажется, что сеанс установлен по возвращении из Facebook. Сеанс сохраняется как запрос в запросеобработчик (FacebookAuthHandler) в двух местах self.auth.session (дикт) и self.session (SecureCookieSession), но после перенаправления на RegistrationPage значение self.auth.session отсутствует.

Перенаправление из SignUpPage вLoginPage происходит из-за того, что метод get SignupHandler имеет декоратор @login_required, который смотрит на self.auth.sessionопределить, нужно ли обрабатывать запрос здесь или перенаправлять его.

Так почему же self.auth.session не сохраняется между запросами, в то время как self.session сохраняется?self.auth.session устанавливаются при каждом запросе?Как хранятся сессии?Если он находится в БД, имеет ли значение тип хранилища данных (master / slave или high replication).

Я копаюсь в исходном коде, но не могу найти ничего полезного.

..fredrik

РЕДАКТИРОВАТЬ

Отправленный ответ ниже.

1 Ответ

1 голос
/ 22 августа 2011

Я сузил это до того, что проблема заключается в свойстве сеанса класса SessionAuthStore.

При доступе к свойству сеанса (это свойство, которое @login_required просматривает, чтобы определить, перенаправлять ли пользователя или нет) он запускает этот код (в tipfy.auth.SessionAuthStore):

if not self.loaded:
    self._load_session_and_user()

return self._session

Проблема здесь в том, что в методе _load_session_and_user ожидается возможность загрузки пользователя из хранилища данных на основе «токена»ключ внутри сеанса.

К сожалению, при возвращении из Facebook нет пользователя.Так что это не удастся и перенаправит пользователя на страницу входа.

Чтобы продолжить работу в своем проекте, я немного изменил код, @login_required (tipfy.auth.init.py)

if not auth.session:
        auth._load_session() # If no session try to load it from the _session_base

    if not auth.session:
        return handler.redirect(auth.login_url())

И новый метод для класса MultiAuthStore.

def _load_session(self):
        self.loaded = True
        session = self._session_base.get('_auth', {})
        if session:
            self._session = session

Возможно, не лучшее решение, но оно работает.

...