Google appengine(Python)中的会话创建 - 简单的身份验证失败

时间:2013-06-25 07:10:07

标签: google-app-engine python-2.7 session-cookies facebook-login

我们在Google Appengine(Python 2.7)上运行了一个应用程序,它使用Simple Auth登录和webapps2框架。 我们目前只支持Facebook登录。

问题:有时,facebook登录 - 会话创建无法正常运行。 这不会一直发生,它只会影响网站总流量的10%。 从Facebook身份验证到我们网站的回调正常,我们也能够获得Facebook身份验证令牌。但是单独创建会话失败了。

控制流程 1)用户点击我们页面上的“使用Facebook登录”按钮 2)用户被重定向到Facebook获取权限(如果是第一次登录) 3)用户在Facebook上获得适当的授权后被重定向回我们的网站 4)在我们的网站上获得用户身份验证令牌,我们使用此令牌从Facebook图表API获取用户详细信息 5)创建会话并在响应对象上设置cookie标头(当前发生问题的位置) 6)用户被重定向到我们的仪表板(仪表板是仅为登录用户显示的屏幕。因此,如果未正确创建会话/ cookie,则用户将被重定向回登录页面。)

补救措施已尝试过: 我的第一个猜测是会话创建比下一行代码要花费更多时间。如果会话创建是异步过程,则会发生这种情况。所以我在会话创建行和下一行之间包含了一个小延迟。我们的想法是给予足够的时间来提交未提交的更改。另外,如果在休眠时间结束时没有真正创建会话,我会尝试重新创建会话对象。

ok, user = self.auth.store.user_model.create_user(auth_id, **_attrs)
logging.info("creating user : "+str(ok)+" | user" +str(user))
if ok:
    self.auth.set_session(self.auth.store.user_to_dict(user))
    logging.info("User: "+str(self.auth.get_user_by_session()))
    if( self.auth.get_user_by_session() is None ):
        logging.info("Existing user logging in.. But the set session didn't work So wait for sometime")
        time.sleep(0.5)
        if( self.auth.get_user_by_session() is None ):
            logging.info("Existing user logging in.. But the set session didn't work So try again")
            self.auth.set_session(self.auth.store.user_to_dict(user))

但上述技术无效。所以,我的诊断存在缺陷。

请求帮助解决此问题。如果您需要更多相关信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

一般来说,等待是同步的一个不好的借口。

在任何一种情况下,您都需要深入了解您的auth库进行调查。 您不希望auth.set_session是异步的。让它同步。这应该会让生活更轻松。

了解get_user_by_session()的工作原理。您描述的问题听起来很像最终的一致性行为。如果get_user_by_session()发出数据存储区查询操作,可能会发生这种情况,这可能会返回最终一致的结果。对于get_user_by_session()操作,您需要非常一致的结果,因此库应该使用数据存储区获取操作。实际上,由于您刚刚创建了用户和会话,因此库应该缓存该信息,而不应该根据数据存储区进行访问。

库是python,你应该能够逐步完成库代码并弄清楚发生了什么。