2010-08-26 21 views
59

Mi aplicación de Facebook de muestra funcionaba muy bien ayer en Chrome. La página integra Silverlight y Facebook a través del JavaScript SDK. Puedo verificar el estado de inicio de sesión básico, iniciar sesión en Facebook, obtener su nombre y cerrar la sesión.Facebook ofrece el error "Intento de JavaScript no autorizado para acceder al marco con URL" en Chrome

Hoy, sin cambios en mi parte, está roto en Chrome con un error de JavaScript que es muy común en los resultados de búsqueda de Google, pero no hay respuestas reales. Todavía funciona muy bien en IE y Firefox.

Aquí está la dirección URL pública:

http://www.andrewdothay.net/prj/facebook/

Al abrir la consola JavaScript en Chrome, que arroja toneladas de estos errores:

intento

inseguro JavaScript para acceder marco con el URL

http://www.facebook.com/login.php?api_key=151352704876752&cancel_url=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df1175dd3f%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&channel_url=http%3A%2F%2Fwww.andrewdothay.net%2Fprj%2Ffacebook%2F&display=popup&fbconnect=1&locale=en_US&method=auth.login&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3c546942%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session=1&sdk=joey&session_version=3&v=1.0 desde el marco con URL http://www.andrewdothay.net/prj/facebook/.

Los dominios, protocolos y puertos deben coincidir.


¿Alguna idea sobre qué está pasando con Chrome aquí?


actualización

descubrí que Chrome en la máquina de hoy estaba bloqueando la entrada emergente cuando estaba llamando FB.login(), pero sé que no estaba recibiendo esos mensajes de error 190 en la consola de JavaScript ayer.

Por lo tanto, cuando dejo ventanas emergentes en Chrome, funciona para un usuario final, pero todos esos nuevos mensajes de error están matando mi experiencia de diagnóstico como desarrollador.

+0

Muy extraño. Me sale este error con bastante frecuencia en aplicaciones de Facebook en Chrome, y a veces algo similar en FF. Sin embargo, generalmente obtengo el error solo una vez, y luego todo funciona como se esperaba. – Matt

Respuesta

28

He encontrado la solución. Si ejecuta FB.login sin acción del usuario, webkit bloquea las ventanas emergentes.

Por ejemplo, utilicé un sistema de invitación en mi proyecto. Había una entrada/texto para ingresar el código de invitación. Comprobé que el código de invitación está disponible con una solicitud ajax/post. si está disponible, ejecuto FB.login(). Como supones, el navegador bloqueó una ventana emergente y aparecieron toneladas de errores en la consola js.

Por lo tanto, debe ejecutar FB.login() después de una acción del usuario. Pondré un botón de inicio de sesión de Facebook entre ajax/post y FB.login(). Los usuarios tendrán que hacer clic, lo cual es una mierda, pero no verán un problema.

Por cierto, el problema se produce en unos pocos días. Creo que se trata de un sistema de confianza del navegador. Cuando lo está desarrollando, lo visita muchas veces, el navegador cree que es confiable al principio. No estoy seguro de esta parte, pero mi solución funciona.

+1

Esto significa que no podemos usar FB.Event.subscribe ('auth.statusChange', onStatus); ? – BeaverProj

+1

@BeaverProj No lo intenté así, no sé. –

+0

¿Qué tan cerca debe estar la acción del usuario de la llamada FB.login? Recibo una ventana emergente pero dice "apareció un error. Inténtalo de nuevo más tarde". Tengo un botón que llama a una función que luego llama a FB.login. ¿Crees que eso no es lo suficientemente directo? –

1

Mücahit Yılmaz es correcto. Tome el ejemplo que pegué a continuación y si usa el método setTimeout() falla, de lo contrario funciona. Sigo recibiendo el mensaje de advertencia en un bucle hasta que inicie sesión correctamente pero es un precio pequeño a pagar. Estoy seguro de que los usuarios no lo verán.

$(document).ready(function() { 
$("#facebook_link").click(function() { 
    //setTimeout(fb); 
    fb(); 
    return false; 
}); 

function fb() { 
    FB.getLoginStatus(function(response) { 
     if (response.session) { 
      // logged in and connected user, someone you know 
      gotResponse(response); 
     } else { 
      // no user session available, someone you dont know 
      FB.login(function(response) { 
       if (response.session) { 
        // user successfully logged in 
        gotResponse(response); 
       } else { 
        // user cancelled login, do nothing 
       } 
      }); 
     } 
    }); 
} 

function gotResponse(response) { 
    console.dir(response); 
} 

});

Es fácil de reproducir: inicie sesión en Facebook en otra pestaña, luego pruebe este código y no verá advertencias. Cierre sesión, luego pruebe el código y obtendrá las advertencias. Es porque golpea el bloque .login.

5

En mi caso fue a causa de facebook JS cargado varias veces en una sola página: una para iniciar sesión y la segunda para el botón "Me gusta". Eliminar la referencia en el módulo "me gusta" guarda el día.

+1

Similar para mí. Estaba llamando a FB.init después de inicializar el SDK con la URL //connect.facebook.net/en_US/all.js#xfmbl=1&appId=[appId] - Creo que xfmbl = 1 causa un FB.init implícito, aunque el Facebook la documentación no es concluyente sobre esto. Cuando eliminé la llamada por separado a FB.init, el problema desapareció. – xgretsch

+0

'xfmbl' (que debe leerse" transfumble ") no parece marcar la diferencia. Tuve exactamente el mismo problema. – Potatoswatter

1

Tuve este problema con un navegador Chrome y fue debido a mi configuración de Chrome. Tuve el navegador configurado para no permitir que los sitios de terceros establezcan datos de cookies. Permitir ventanas emergentes no fue un problema para mí. Cuando se crea el iFrame de Facebook, debe establecer una cookie que luego usa para rastrear si el usuario necesita iniciar sesión. Si no se permite establecer esa cookie, el sitio falla. Una cosa que sería útil en la API de Facebook sería una configuración que muestra cuando algo está fallando. No veo eso como un evento al que uno pueda suscribirse y asignar una devolución de llamada.

Aquí hay un enlace al FB javascript sdk en las suscripciones. Se agradecería cualquier respuesta sobre cómo encontrar una devolución de llamada para solicitudes fallidas.
https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

0

La solución de Mücahit Yılmaz funcionó bien para mí también. No necesitaba acceder a la información del usuario, así que eliminé el script de inicio de sesión de la aplicación de muestra. También se eliminó el mensaje de bienvenida y cualquier información que requiera información almacenada en la variable $basic.

1

En mi caso, el problema estaba relacionado con la etiqueta <div id="fb-root"></div>. No lo estaba poniendo inmediatamente después de la etiqueta de apertura <body>, as recommended by the docs.

Después de colocarlo en el lugar correcto, se detuvo el error "JavaScript no seguro ...".

2

Al eliminar la opción 'xfbml: true' de mi llamada a FB.init solucioné esto por mí.

que estaba teniendo el problema en el navegador de Internet predeterminado en Android Jelly Bean

1

Y en mi caso, el problema estaba relacionado con el tipo de protocolo: de:

<div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx" 

a:

<div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx" 

como mi tienda web no usó https Quité 's' del atributo data-href de likebox.

+1

Creo que puedes poner //www.facebook.com/.... Ver: http: //stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just –

Cuestiones relacionadas