2012-06-22 9 views
11

Así que basado en la información aquí Safari 3rd party cookie iframe trick no longer working? y aquí Missing cookies on iframe in safari 5.1.5 está claro que los viejos trucos no trabajarán:Django marco flotante Safari Fix

from django.http import HttpResponse 
from django.conf import settings 


SESSION_COOKIE_NAME = getattr(settings, 'SESSION_COOKIE_NAME') 

class SafariIFrameFixMiddleware(object): 
    """ 
    Middleware fixes sessions with Safari browser in iframes 

    Safari default security policy restricts 
    cookie setting in first request in iframe 

    Solution is to create hidden form to preserve GET variables 
    and REPOST it to current URL 
    """ 
    def process_request(self, request): 
     if request.META['HTTP_USER_AGENT'].find('Safari') != -1 \ 
       and request.META['HTTP_USER_AGENT'].find('Chrome') == -1 \ 
       and SESSION_COOKIE_NAME not in request.COOKIES \ 
       and 'cookie_fix' not in request.GET: 
      html = """<html><body><form name='cookie_fix' method='GET' action='.'>""" 
      for item in request.GET: 
       html += "<input type='hidden' value='%s' name='%s' />" % (request.GET[item], item) 
      html += "<input type='hidden' name='cookie_fix' value='1' />" 
      html += "</form>" 
      html += '''<script type="text/javascript">document.cookie_fix.submit()</script></html>''' 
      return HttpResponse(html) 
     else: 
      return 

Así que estoy buscando nueva manera de solucionarla.

Parece que requiere abrir la ventana (con permiso del usuario/clic o será bloqueado por safari) y comenzar la sesión allí.

El problema es que la misma página emergente ejecutará todos los middlewares por lo que no siempre será viable dentro del proyecto (quiere la menor solución intrusiva posible).

También el inicio de la sesión django está dentro del middleware, no he encontrado ninguna forma limpia de iniciar uno manualmente. ¿Alguna sugerencia?

+0

¿Por qué necesita iniciar una sesión manualmente? Si su ventana emergente proviene de Django y pasa por el middleware, obtiene la nueva sesión automáticamente, si no existe. – Anentropic

+0

¿por qué no usó js y poste para reemplazar en iframe? – Efazati

Respuesta

Cuestiones relacionadas