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
编辑
发表以下答案.
我已将问题范围缩小到问题出在 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)
可能不是最好的解决方案,但它确实有效。
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |