2012-04-03 52 views
7

Tengo un problema para hacer que mi aplicación de Facebook funcione en Safari.Las sesiones de Safari y php no funcionan en el iframe de Facebook

El problema está relacionado con las variables de sesión de PHP.

Soy consciente de que Safari tiene un problema de tratar con sesiones de dominios cruzados (dentro de un iframe) y me encontré alrededor de 2 tipos de soluciones:

  1. indicando en la cabecera P3P: He probado muchas cabecera P3P encontrado alrededor, pero ninguno de ellos funcionó [por ejemplo: header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');].
  2. Enviando una publicación al iframe, usando javascript. Esto crea interacción y las sesiones deberían funcionar. Pero el hecho es que no controlo el contenedor iframe, ya que es Facebook.

¿Alguien conoce una solución alternativa?

Gracias!

+0

Tuve el mismo problema y [he creado una solución alternativa para mí] (http://stackoverflow.com/a/10833632/770984). Espero que esto ayude. –

Respuesta

3

EDIT: confirmado, esta solución ya no funciona en Safari 5.1 en Mac. Discutido aquí: Safari 3rd party cookie iframe trick no longer working?

No sé cuál es su caso de uso, pero en nuestra aplicación tenemos una pantalla de bienvenida con un botón "Permitir acceso" que abre el cuadro de diálogo de permisos. Cuando el usuario hace clic en 'Permitir acceso', lo utilizo para abrir una nueva ventana que establece la sesión y se cierra inmediatamente (esto se propuso en la pregunta vinculada anteriormente). Después de que el usuario haya permitido el acceso, ¿puede volver a cargar la página? En nuestro caso, esto no es necesario, ya que toda comunicación con el servidor es con ajax.


estoy usando la segunda solución y no tienen ningún problema con él, aquí está mi código (usando jQuery):

/** 
* Hack for Safari cross-domain cookies. See: 
* http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/ 
*/ 

$(document).ready(function() { 

    var isSafari = (/Safari/.test(navigator.userAgent)); 

    if (isSafari) { 
     var iframe = $("<iframe />"); 
     iframe.attr("id", "cookieframe"); 
     iframe.attr("name", "cookieframe"); 
     iframe.hide(); 

     var form = $("<form />"); 
     form.attr("id", "cookieform"); 
     form.attr("target", "cookieframe"); 
     form.attr("enctype", "application/x-www-form-urlencoded"); 
     form.attr("action", "startsession.php"); 
     form.attr("method", "post"); 

     $("body").append(iframe); 
     $("body").append(form); 
     form.submit(); 
    } 

}); 

En startsession.php estoy empezando la sesión:

<?php session_start(); 
+1

Esta solución no funciona para mí. Configuro variables de sesión antes de cualquier salida html, así que no puedo usar este javascript para enviar la publicación. En ese momento, necesito leer las sesiones que ya he generado. – user1310165

+0

no funciona en safari en snowleopard –

+0

No funciona. Sigue enviando. – Steve

3

Llego tarde a esto, pero bien podría ayudar a alguien más a buscar este problema.

El único método que podría hacer el trabajo fue detectar safari desde dentro de mi iframe y redirigirlo a otra página momentáneamente donde podría establecer mi cookie de sesión, y luego redireccionar hacia atrás.

<?php 
// sort out ie with the below header 
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); 
session_start(); 
$_SESSION = array(); 

// if Safari and no cookies have been set yet, take me to another page to set a session cookie 
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { 
    if (count($_COOKIE) === 0) { 
    echo '<script> 
    top.location = "http://www.domain.com/setcookie.php"; 
    </script>'; 
    } 
} 
?> 

Luego de setcookie.php

<?php 
//inside setcookie.php 
header('P3P: CP="CAO PSA OUR"'); 
session_start(); 
$_SESSION = array(); 

echo 
'<script> 
top.location = "http://www.backtooriginaldomain.com"; 
</script>'; 
?> 

es un poco escaso, pero funciona y no interfiere con los otros navegadores. El otro método es usar una ventana emergente aunque mi safari tenía esto bloqueado por defecto.

+0

Interesante. Soy un principiante en PHP e intento resolver el mismo problema, pero para Rails. ¿Puedes explicar por qué esta solución funciona? – colllin

0

de lejos no es la mejor solución pero no necesita ninguna página adicional coloque la solución en la primera posición de su página para que solo vea algunos parpadeos blancos.

<?php 
if (isset($_GET['safarifix'])) { 
    session_start(); 
    echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>'; 
    exit(); 
} 

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) { 
    header('P3P: CP="CAO PSA OUR"'); 
    echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>'; 
    exit(); 
} 
?> 

envíe su url de referencia a la página donde realmente hace sus cosas. nada adicional es necesario. luego volver a consultar la página en la que ha estado en primer lugar.

Cuestiones relacionadas