5

我正在尝试模仿示例http://tipfy-auth.appspot.com中的登录页面(来源http://code.google.com/p/tipfy/source/browse/examples/auth/app/)没有成功。当用户被重定向回页面时,我似乎遇到了问题。当前的请求流程如下所示:

登录页面( LoginHandler) -> Facebook 重定向 ( FacebookAuthHandler) 302 -> Facebook.com -> Facebook 重定向 ( FacebookAuthHandler) 302 -> 注册页面 ( ) 302 -> 登录页面 ( SignupHandler) LoginHandler

这里的问题(据我所知)是从注册(应该是端点)到登录页面的最后一个 302(http-redirect)。

经过一些密集的日志记录(无法在本地进行测试)后,似乎从 facebook 返回时设置了一个会话。会话在请求处理程序 ( FacebookAuthHandler) 的两个地方self.auth.session(a dict) 和self.session(a SecureCookieSession) 中存储为 dict,但在重定向到 SignupPage 之后self.auth.session为 None。

发生从 SignUpPage 到 LoginPage 的重定向是因为SignupHandler's get 方法有一个装饰器@login_requiredself.auth.session用于确定是否应在此处处理或重定向请求。

那么,为什么 self.auth.session 不保留在请求之间,而 self.session 保留呢?是否self.auth.session按每个要求设置?会话如何存储?如果它在数据库中,数据存储类型是否重要(主/从或高复制)。

我正在挖掘源代码,但找不到任何有用的东西。

..弗雷德里克

编辑

下面贴出答案。

4

1 回答 1

1

我已将其范围缩小到问题出在 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

可能不是最好的解决方案,但它有效。

于 2011-08-22T08:25:51.130 回答