2

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

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

控制流程: 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))

但上述技术不起作用。因此,我的诊断存在缺陷。

请求帮助解决这个问题。如果您需要更多信息,请告诉我。

4

1 回答 1

0

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

无论哪种情况,您都需要深入研究您的身份验证库进行调查。您不希望 auth.set_session 是异步的。使其同步。那应该让生活更轻松。

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

库是 python,你应该能够单步执行库代码并弄清楚发生了什么。

于 2013-06-25T16:24:39.773 回答