Esta es la enésima venganza de la pregunta "¿Cómo puedo hacer que las cookies de terceros funcionen en Safari?", Pero vuelvo a preguntar porque creo que el campo de juego ha cambiado, quizás después de febrero de 2012. Uno de los trucos estándar para obtener la tercera las cookies de fiesta en Safari fueron las siguientes: use algunos javascript para PUBLICAR en un iframe oculto. (Solía) engañar a Safari para que pensara que el usuario había interactuado con el contenido de terceros y luego permitir que se establecieran cookies.
Creo que esta laguna se ha cerrado a raíz del leve escándalo en el que se reveló que Google estaba usando ese truco con sus anuncios. Por lo menos, mientras uso este truco, no he podido configurar las cookies en Safari. Descubrí algunas publicaciones aleatorias en Internet que afirmaban que Apple estaba trabajando para cerrar la brecha pero no encontré ninguna palabra oficial.
Como alternativa, incluso intenté rediseñar el marco principal de terceros para que tuviera que hacer clic en un botón antes de que se cargara el contenido, pero incluso ese nivel de interacción directa no fue suficiente para derretir el frío y frío corazón de Safari.
Entonces, ¿alguien sabe con certeza si Safari realmente ha cerrado esta escapatoria? Si es así, ¿hay otras soluciones (además de incluir manualmente una ID de sesión en cada solicitud)?
fuente
Respuestas:
Solo quería dejar una solución de trabajo simple aquí que no requiera la interacción del usuario .
Como dije en una publicación que hice :
Básicamente, todo lo que necesita hacer es cargar su página en top.location, crear la sesión y redirigirla a Facebook.
Agregue este código en la parte superior de su
index.php
y configúrelo$page_url
en la pestaña final de la aplicación / URL de la aplicación y verá que su aplicación funcionará sin ningún problema.Nota: Esto se hizo para Facebook, pero en realidad funcionaría en cualquier otra situación similar.
Edición 20-dic-2012 - Mantenimiento de la solicitud firmada:
El código anterior no mantiene los datos de publicación de solicitudes, y usted perdería la solicitud firmada, si su aplicación se basa en una solicitud firmada, no dude en probar el siguiente código:
Nota: Esto todavía se está probando correctamente y puede ser menos estable que la primera versión. Uso bajo su propio riesgo / Comentarios son apreciados.
(Gracias a CBroe por señalarme en la dirección correcta aquí permitiendo mejorar la solución)
fuente
Dijiste que estabas dispuesto a que tus usuarios hicieran clic en un botón antes de que se cargue el contenido. Mi solución fue hacer que un botón abriera una nueva ventana del navegador. Esa ventana establece una cookie para mi dominio, actualiza el abridor y luego se cierra.
Entonces su script principal podría verse así:
Entonces safari_cookie_fix.php se ve así:
fuente
Engañé a Safari con un .htaccess:
Y dejó de funcionar para mí también. Todas mis aplicaciones están perdiendo la sesión en Safari y están redirigiendo fuera de Facebook. Como tengo prisa por arreglar esas aplicaciones, actualmente estoy buscando una solución. Te mantendré informado.
Editar (2012-04-06): Aparentemente Apple lo "arregló" con 5.1.4. Estoy seguro de que esta es la reacción al asunto de Google: "Existía un problema en la aplicación de su política de cookies. Los sitios web de terceros podrían establecer cookies si la preferencia" Bloquear cookies "en Safari estaba configurada en la configuración predeterminada" De terceros y anunciantes ". Http://support.apple.com/kb/HT5190
fuente
En su controlador Ruby on Rails puede usar:
fuente
redirect_to params[:return_to]
. Ese parámetro debe verificarse en una lista blanca de lugares seguros a los que redirigir. Ver owasp.org/index.php/…Para mi situación específica, resolví el problema usando window.postMessage () y eliminando cualquier interacción del usuario. Tenga en cuenta que esto solo funcionará si de alguna manera puede ejecutar js en la ventana principal. Ya sea que incluya un js de su dominio, o si tiene acceso directo a la fuente.
En el iframe (dominio-b) verifico la presencia de una cookie y, si no está configurada, enviaré un mensaje posterior al padre (dominio-a). P.ej;
Luego, en la ventana principal (dominio-a), escuche el evento.
Finalmente, en su servidor (http://www.domain-b.com/safari/cookiefix) configura la cookie y redirige de nuevo a donde vino el usuario. El siguiente ejemplo está usando ASP.NET MVC
fuente
"*"
paraPostMessage
corregir el error de sintaxisTuve el mismo problema y hoy encontré una solución que funciona bien para mí. Si el agente de usuario contiene
Safari
y no se configuran cookies, redirijo al usuario al cuadro de diálogo OAuth:Después de la autenticación y solicitar permisos, el cuadro de diálogo OAuth redirigirá a mi URI en la ubicación superior. Por lo tanto, es posible configurar cookies. Para todas nuestras aplicaciones de lienzo y pestaña de página, ya he incluido el siguiente script:
Por lo tanto, el usuario será redirigido nuevamente a la pestaña de la página de Facebook con una cookie válida ya configurada y la solicitud firmada se publica nuevamente.
fuente
Finalmente busqué una solución similar a la que proporcionó Sascha, sin embargo con algunos pequeños ajustes, ya que configuro las cookies explícitamente en PHP:
Lo que esto hace es verificar si la cookie está disponible cuando el navegador es safari. En el siguiente paso, estamos en el dominio de la aplicación, es decir, el URI proporcionado como URL_WHERE_APP_IS_LOCATED arriba.
Entonces, después de redirigir al dominio de la aplicación, se establece una cookie explícitamente y redirijo al usuario al proceso de autorización.
En mi caso (ya que estoy usando CakePHP pero debería funcionar bien con cualquier otro marco MVC), estoy llamando a la acción de inicio de sesión nuevamente donde la autorización FB se ejecuta otra vez, y esta vez tiene éxito debido a la cookie existente.
Después de autorizar la aplicación una vez, no tuve más problemas para usar la aplicación con Safari (5.1.6)
Espero que eso pueda ayudar a cualquiera.
fuente
Tuve este problema en dispositivos con iOS. Hice una tienda que se puede insertar en un sitio web normal usando un iframe. De alguna manera, en cada carga de página, el usuario obtiene un nuevo ID de sesión, lo que hace que los usuarios se atasquen a mitad del proceso porque algunos valores no estaban presentes en la sesión.
Probé algunas de las soluciones dadas en esta página, pero las ventanas emergentes no funcionan muy bien en un iPad y necesitaba la solución más transparente.
Lo resolví usando una redirección. El sitio web que incrusta mi sitio primero debe redirigir al usuario a mi sitio, por lo que el marco superior contiene la URL a mi sitio, donde configuro una cookie y redirijo al usuario a la página correcta en el sitio web que incrusta mi sitio, que se pasa a través de la url.
Ejemplo de código PHP
El sitio web remoto redirige al usuario a
init.php
El usuario termina
http://www.domain.com/shop/frame
donde está incrustado mi sitio, almacena las sesiones como debería y come cookies.Espero que esto ayude a alguien.
fuente
Permítanme compartir mi solución en ASP.NET MVC 4. La idea principal como en la respuesta correcta para PHP. El siguiente código agregado en el diseño principal en el encabezado cerca de la sección de scripts:
fuente
Esta solución se aplica en algunos casos, si es posible:
Si la página de contenido del iframe usa un subdominio de la página que contiene el iframe, la cookie ya no está bloqueada.
fuente
Google realmente dejó al gato fuera de la bolsa en este caso. Lo usaron durante un tiempo para acceder a las cookies de seguimiento. Fue corregido casi de inmediato por Apple = \
publicación original del Wall Street Journal
fuente
Aquí hay un código que uso. Descubrí que si configuro cualquier cookie de mi sitio, las cookies funcionan mágicamente en el iframe a partir de ese momento.
http://developsocialapps.com/foundations-of-a-facebook-app-framework/
fuente
Una versión ligeramente más simple en PHP de lo que otros han publicado:
fuente
He encontrado la respuesta perfecta a esto, todo gracias a un tipo llamado Allan que merece todo el crédito aquí. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )
Su solución es simple y fácil de entender.
En el servidor de contenido de iframe (dominio 2), agregue un archivo llamado opensession.php en el nivel de dominio raíz que contenga:
Ahora en el sitio web de nivel superior que contiene el iframe (dominio1), la llamada a la página que contiene el iframe debería verse así:
¡Y eso es! Simples :)
La razón por la que esto funciona es porque está dirigiendo el navegador a una URL de un tercero y, por lo tanto, le dice que confíe en él antes de mostrar contenido de él dentro del iframe.
fuente
Utilicé el truco de Whiteagle modificado (agregué el parámetrofirmado_request al enlace) y funcionó bien para un safari, pero IE actualiza constantemente la página en ese caso. Entonces, mi solución para safari e Internet Explorer es:
fuente
También he estado sufriendo este problema, pero finalmente obtuve la solución. Inicialmente, cargue directamente la URL del iframe en el navegador como una pequeña ventana emergente y luego solo acceda a los valores de la sesión dentro del iframe.
fuente
Recientemente me encontré con el mismo problema en Safari. La solución que descubrí se basa en la API HTML5 de almacenamiento local. Con el almacenamiento local, puede emular cookies.
Aquí está mi publicación de blog con detalles: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html
fuente
Decidí deshacerme de la
$_SESSION
variable todos juntos y escribí un contenedor alrededor de memcache para imitar la sesión.Consulte https://github.com/manpreetssethi/utils/blob/master/Session_manager.php
Caso de uso: en el momento en que un usuario aterriza en la aplicación, almacena la solicitud firmada utilizando Session_manager y, dado que está en la caché, puedes acceder a ella desde cualquier página en adelante.
Nota: Esto no funcionará cuando navegue de forma privada en Safari ya que session_id se restablece cada vez que la página se recarga. (Estúpido Safari)
fuente
Puede resolver este problema agregando el encabezado como política p3p ... Tuve el mismo problema en safari, así que después de agregar el encabezado en la parte superior de los archivos, resolvió mi problema.
fuente