2011-06-09 42 views
5

我试图模仿从http://tipfy-auth.appspot.com(源http://code.google.com/p/tipfy/source/browse/examples/auth/app/)登录页面没有成功。当用户重定向回页面时,我似乎遇到了问题。当前请求流程是这样的:facebook tip auth问题与tipfy 1.0b

LoginPage(LoginHandler) - >的Facebook重定向(FacebookAuthHandler)302 - > Facebook.com - >的Facebook重定向(FacebookAuthHandler)302 - > SignupPage(SignupHandler)302 - > LoginPage(LoginHandler)。

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

经过一番激烈的日志记录(无法找到本地测试),似乎从Facebook返回时设置会话。会话作为字典存储在请求处理程序(FacebookAuthHandler)的两个地方self.auth.session(字典)和self.session(a SecureCookieSession)但重定向到SignupPage后self.auth.session为None。

从SignUpPage到LoginPage重定向的发生是由于该SignupHandler的get方法有一个装饰@login_required,着眼于self.auth.session以确定是否reuquest应该在这里处理或重定向。

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

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

..fredrik

编辑下面

发布答案。

+0

请将您的解决方案作为答案发布,以便不会无人接听。 – cope360 2011-08-21 23:13:11

回答

1

我把它缩小到问题在SessionAuthStore类的会话属性中。

当访问会话属性(这是@login_required看,以确定是否将用户重定向或不属性)运行该代码(tipfy.auth.SessionAuthStore):

if not self.loaded: 
    self._load_session_and_user() 

return self._session 

这里的问题在_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()) 

而且在MultiAuthStore类的新方法。

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

可能不是最好的解决方案,但它的工作原理。