登录有时不适用于django中的选项卡/窗口

时间:2012-11-01 19:49:01

标签: django flash

我希望从辅助窗口登录基于django的网站。 即我有一个连接到Django服务器的Flash文件。在Flash文件中选择登录时,它会打开另一个窗口(即Facebook登录弹出窗口)。基于Facebook客户端的登录流程用于登录用户,从中获取的user_id被发送到django服务器以进行识别和登录。 我已在服务器上验证,在此阶段,调用django.contrib.auth的身份验证和登录功能,user.is_authenticated()返回True。

但是在包含Flash文件的原始窗口的客户端,用户有时仍然是AnonymouseUser,即未登录。在其他时候,用户被正确识别。

在检查当前会话的数据库条目时,我看到当用户没有登录时,会出现两个会话,而当用户登录时,只有一个会话。

我不确定为什么会创建一个额外的会话以及如何解决这个问题。

注意 - 我正在使用自定义身份验证后端。

更新 我挖到了django系统,看看发生了什么。 Django有一种在维护数据的同时更改会话密钥的机制。 在我的情况下发生的事情是会话密钥的更改发生两次。一旦它在登录期间按预期发生。但在此之后,另一个请求会导致会话密钥发生变化。我的客户端代码中没有提出此请求。 似乎请求是/favicon.ico 不确定这是从哪里来的。任何帮助表示赞赏。

更新2 它似乎与favicon.ico有关 现在我在root上服务它,在几次刷新之后,事情正常运行。我认为之前出现的问题是因为浏览器对favicon的请求在会话失败时搞乱了会话。在确认并解决此问题之前,我将进行更多测试。

更新3 没解决。如果有人能指出我正确的方向,我真的很感激。 在那之前,我将看看是否可以更改登录流程以绕过此机制。

更新4 因此,在经历了一些堆栈跟踪(如果需要我可以共享)之后,我意识到以下内容。由于Django在登录用户时更改了会话ID,因此会创建一个会话ID引发两个会话ID的情况,如下所示。 请求1 - 导致登录的ajax请求。此请求具有先前由django提供的会话密钥,例如key1。作为响应,服务器发送回一个新的会话密钥,比如key2,同时从其内存中删除key1(在我的案例数据库中) 请求2 - 这是浏览器在favicon.ico的请求1之后发出的隐式请求。 (你可能知道这个请求是由浏览器提出的,我无法控制它) 此请求还附带sam原始密钥,即key1。由于此密钥在Django的内存中不可用,因此它会创建一个新密钥key3并在响应中发回。

因此,所有进一步的请求都是使用key3进行的,django使用新会话进行识别,并且使用key2存储的登录状态将丢失。

我不确定这是否是Django中的错误或者这是否是预期的行为。 但是,如果这是一个预期的行为,当任何客户端在等待先前的响应并触发密钥更改之前发出多个ajax请求时,它将产生问题。

话虽如此,我原来的问题仍然存在,如果找到一个,我会发布解决方案。

1 个答案:

答案 0 :(得分:0)

我现在申请的解决方案是将多个(截至目前为止2)调用登录网址。 这意味着如果事情如上面在更新4中所解释的那样工作,则第二个登录请求将使用key3并将接收key4。但由于我的代码或浏览器没有其他并发请求,因此该密钥将保留,用户将始终登录。 经过2天的测试,到目前为止似乎正在发挥作用。

但是我的解决方案是一种解决方法,我仍然想知道这是django中的错误还是我的代码逻辑中出现了问题。