2012-04-03 12 views
7

Ho un problema per far funzionare la mia app di Facebook su Safari.Le sessioni di Safari e PHP non funzionano su Facebook iframe

Il problema è correlato alle variabili di sessione PHP.

Sono consapevole del fatto che Safari ha un problema di trattare con sessioni di dominio croce (all'interno di un iframe) e ho trovato circa 2 tipi di soluzioni:

  1. Impostazione dell'intestazione P3P: Ho provato molti intestazione P3P trovato intorno ma nessuno di loro ha funzionato [ad esempio: header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');].
  2. Invio di un post all'iframe, utilizzando javascript. Questo crea interazione e le sessioni dovrebbero funzionare. Ma il fatto è che io non controllo il contenitore iframe, dato che è Facebook.

Qualcuno conosce una soluzione alternativa?

Grazie!

+0

Ho avuto lo stesso problema e [ho creato una soluzione adatta a me] (http://stackoverflow.com/a/10833632/770984). Spero che questo ti aiuti. –

risposta

3

MODIFICA: Confermato, questa soluzione alternativa non funziona più su Safari 5.1 su Mac. Discusso qui: Safari 3rd party cookie iframe trick no longer working?

Non so qual è il tuo caso d'uso, ma nella nostra app abbiamo una schermata di benvenuto con un pulsante "Consenti accesso" che apre la finestra di dialogo delle autorizzazioni. Quando l'utente fa clic su "Consenti accesso", lo utilizzo per aprire una nuova finestra che imposta la sessione e si chiude immediatamente (ciò è stato proposto nella domanda collegata sopra). Dopo che l'utente ha autorizzato l'accesso, puoi ricaricare la pagina? Nel nostro caso questo non è necessario poiché tutte le comunicazioni con il server sono con ajax.


sto usando la seconda soluzione e non hanno alcun problema con esso, ecco il mio codice (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(); 
    } 

}); 

In startsession.php Sto solo di iniziare la sessione:

<?php session_start(); 
+1

Questa soluzione non funziona per me. Ho impostato le variabili di sessione prima di qualsiasi output html, quindi non sono in grado di utilizzare questo javascript per inviare il post. In quel momento, ho bisogno di leggere già le sessioni che ho già generato. – user1310165

+0

non funziona su safari su snowleopard –

+0

Non funziona. Continua con l'invio. – Steve

3

Sono in ritardo, ma potrebbe aiutare qualcun altro a risolvere questo problema.

L'unico metodo che ho potuto fare il lavoro è stato quello di rilevare safari dall'interno della mia iframe e reindirizzare a un'altra pagina momentaneamente dove ho potuto impostare il mio cookie di sessione - quindi reindirizzare indietro.

<?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>'; 
    } 
} 
?> 

Poi da 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>'; 
?> 

sua un po 'zoppo, ma funziona e non interferisce con gli altri browser. L'altro metodo è usare una finestra popup anche se il mio safari lo ha bloccato per impostazione predefinita.

+0

Interessante. Sono un principiante in PHP e sto cercando di risolvere lo stesso problema ma per Rails. Puoi spiegare perché questa soluzione funziona? – colllin

0

di gran lunga la soluzione migliore ma non è necessario alcun ulteriore Pagine mettere la soluzione nella prima posizione della pagina in modo da visualizzare solo alcuni sfarfallio bianco.

<?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(); 
} 
?> 

invia il tuo URL di riferimento alla pagina in cui effettivamente si fanno le proprie cose. niente di ulteriore necessario. quindi reffer indietro alla pagina che sei stato in primo luogo.

Problemi correlati