Django会话不在iframe中维护

时间:2018-12-05 07:15:32

标签: django iframe django-sessions

我正在使用django创建一个对话式聊天机器人。为了保持chatbot中的聊天流程,我使用django会话。但是,当我在iframe中使用聊天机器人的链接时,它不存储任何会话,并且流量中断。我想要一个即使在iframe中也有助于维护会话的函数。

用于iframe

<html>
<head></head>
<body>
<embed style=" width: 384px; height: 525px; margin-right: 0px !important; bottom: 0px; float: right; position: absolute; bottom: 30px; width: 100%;" frameborder="0" scrolling="no" id="iframe" src="http://*********.com/********/*******.html">


</body>
</html>

用于维护会话的代码

@staticmethod
    def extract_data(request, input_data):
        from chat import validations
        if 'city' not in request.session:
            response_data = {'extra': {}, 'data': {}}
            response_data['extra']['statement'] = 'Select Car Model which you like to rent?'
            response_data['extra']['type'] = 'carmodel'
            response_data['data'] = Cars.city_check(request,response_data, input_data)

        elif 'veh_name' not in request.session:

            response_data = Cars.veh_name_check(request, input_data)

        elif 'days' not in request.session:
            response_data = validations.days_check(request, input_data)

        elif 'phone' not in request.session:
            response_data = validations.phone_check(request, input_data)

        elif 'email' not in request.session:

            response_data = validations.mail_check(request, input_data)

        elif 'name' not in request.session:
            response_data = validations.name_check(request, input_data, 'Car')

        return response_data

2 个答案:

答案 0 :(得分:1)

这与django无关。当前,浏览器对于使框架/嵌入式设备访问Cookie充满偏执,即使它们是Cookie的来源。此外,许多用户还阻止了第三方cookie(通常包括框架cookie)或所有cookie。您可以将会话ID嵌入this answer suggests作为框架ID,其中会话ID由Django模板或客户端javascript 在包含框架的页面上生成(完全随机或从cookie中获取), / em>可能有权访问cookie。

您可能还想考虑完全放弃嵌入/框架,而采用django include块,该块将聊天内容窗口作为div或类似内容插入包含页面,因此可以更好地访问cookie或其他会话变量。在这种情况下,我将javascript和html分开,并将js脚本标签放在头部。

作为最后一击,您可以使用客户端的公共ip和用户代理以及包含页面的URI(对于模板)的组合来替换对cookie的依赖。

编辑关于安全性:(在@EthanKeller发表评论之后)

浏览器试图保护框架免受主要内容的影响,反之亦然。这都取决于是否包含任何敏感信息。如果是这样,那么我建议通过将框架放在其自己的窗口/选项卡中(可能通过弹出调用)将它们分开。但是,对于聊天机器人,我怀疑是否有这么敏感的东西。经销商的选择。

答案 1 :(得分:1)

要允许来自iframe的cookie,必须使用SameSite=NoneSecure选项设置cookie。

Set-Cookie: session=your_session; SameSite=None; Secure 

来源:https://medium.com/trabe/cookies-and-iframes-f7cca58b3b9e

要在Django上执行此操作,您必须更新以下设置:

SESSION_COOKIE_SAMESITE = 'None'  # As a string
SESSION_COOKIE_SECURE = True

不幸的是,'None'的{​​{1}}值仅在Django 3.1之后可用,并且有no plan to backport it in 3.0 and 2.2

还请注意,您的网站必须通过HTTPS进行服务。