Django会话不在iframe中维护

kd0*_*001 9 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>
Run Code Online (Sandbox Code Playgroud)

代码用于维护会话

@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
Run Code Online (Sandbox Code Playgroud)

mem*_*tha 5

这个和django关系不大。浏览器目前对允许框架/嵌入访问 cookie 持偏执态度,即使它们是 cookie 的来源。此外,许多用户阻止第三方cookie(通常包括框架cookie)或所有cookie。您可以将会话 ID 嵌入到框架源中,正如这个答案所建议的那样,会话 ID 是由 django 模板或客户端 JavaScript在包含可能有权访问该框架的页面上生成的(完全随机或从 cookie)曲奇饼。

您可能还想考虑完全放弃嵌入/框架,转而使用 django include 块,它将聊天内容窗口作为 div 或类似内容插入到包含页面中,从而更好地访问 cookie 或其他会话变量。在这种情况下,我会将 javascript 与 html 分开,并将 js 脚本标记放在 head 中。

作为最后一搏,您可以用客户端的公共 IP 和用户代理以及包含页面 URI(在模板的情况下)的组合来替换对 Cookie 的依赖。

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

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


Ant*_*ard 5

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

Set-Cookie: session=your_session; SameSite=None; Secure 
Run Code Online (Sandbox Code Playgroud)

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

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

Set-Cookie: session=your_session; SameSite=None; Secure 
Run Code Online (Sandbox Code Playgroud)

不幸的是,'None'valueSESSION_COOKIE_SAMESITE仅自 Django 3.1 起可用,并且没有计划在 3.0 和 2.2 中向后移植它

另请注意,您的网站必须通过 HTTPS 提供服务。