facebook auth问题与tipfy 1.0b

fre*_*rik 5 authentication session google-app-engine tipfy

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

LoginPage(LoginHandler) - > Facebook redirect(FacebookAuthHandler)302 - > Facebook.com - > Facebook redirect(FacebookAuthHandler)302 - > SignupPage(SignupHandler)302 - > LoginPage(LoginHandler).

这里的问题(据我所知)是从注册(应该是端点)到登录页面的最后302(http重定向).

经过一些激烈的日志记录(无法找到本地测试),似乎从facebook返回时会设置一个会话.会话FacebookAuthHandler在两个地方self.auth.session(dict)和self.session(a SecureCookieSession)中作为dict存储在请求handler()上,但在重定向到SignupPage之后self.auth.session是None.

从SignUpPage到LoginPage的重定向发生是因为SignupHandlerget方法有一个装饰器@login_required,self.auth.session用于确定是否应该在此处理或重定向reuquest.

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

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

..fredrik

编辑

发表以下答案.

fre*_*rik 1

我已将问题范围缩小到问题出在 SessionAuthStore 类的会话属性中。

当访问会话属性时(这是@login_required查看以确定是否重定向用户的属性),它运行以下代码(在tipfy.auth.SessionAuthStore中):

if not self.loaded:
    self._load_session_and_user()

return self._session
Run Code Online (Sandbox Code Playgroud)

这里的问题是,在 _load_session_and_user 方法中,期望能够根据会话内的“token”键从数据存储中加载用户。

不幸的是,从 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())
Run Code Online (Sandbox Code Playgroud)

以及 MultiAuthStore 类的新方法。

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

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