El Facebook OAuth emergente es tirar un error en Chrome en iOS sólo. Ambos developers.facebook.com y google han subido nada acerca de esto. Ideas?

Facebook OAuth

7 Comentarios

  1. 16

    Puede utilizar el método de redirección como siga por este caso (al detectar el agente de usuario se chrome ios):

    https://www.facebook.com/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}

    Ver más info aquí https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/

    Comentario: me personnaly utilizar el servidor de OAuth en ese caso, pero esto debe hacer el truco y es bastante simple

    • Tener que detectar el agente de usuario no es la ideal (he escuchado muchos argumentos que es poco confiable). Hay algo que se puede utilizar para la característica de detectar para navegadores móviles en su lugar?
    • Yo no soy consciente de que cualquier otra opción viable en el fin de detectar el navegador del usuario & OS, Para mí es mejor que asumir algunas funciones o variables no está definido si el uso de tal o cual navegador/sistema operativo. Yo siempre he usado el agente de usuario (y todo el mundo lo hace…) y nunca he tenido ningún problema en particular con la excepción de que siempre debe permanecer hasta la fecha debido a que ellos están en constante evolución.
    • Pero ese es el problema fundamental: que usted necesita para mantenerse al día, y usted no es realmente la detección de lo que te importa. Detección de características que siempre deben ser utilizados con preferencia a la de agente de usuario oler cuando sea posible. La pregunta realmente es: ¿es posible aquí?
    • Alguien ha resuelto el problema aquí? Estoy teniendo este problema, así
    • Agente de usuario oler generalmente se desaconseja en favor de la característica de detección por esa razón – no es fácil de mantener. Sin embargo no hay nada de malo o poco fiables acerca de agente de usuario husmeando en y de sí mismo. Este es un error relacionados con un determinado navegador, no un conjunto de características, por lo browser sniffing es absolutamente aceptable. Esta respuesta debería ser aceptado.
  2. 11

    Esta es la forma en que lo hice (fijación de iOS chrome específicamente)

    //fix iOS Chrome
    if( navigator.userAgent.match('CriOS') )
        window.open('https://www.facebook.com/dialog/oauth?client_id='+appID+'&redirect_uri='+ document.location.href +'&scope=email,public_profile', '', null);
    else
        FB.login(null, {scope: 'email,public_profile'});
    • Gracias por la entrada, esto funciona bastante bien. Sin embargo, facebook muestra una advertencia de que la Graph API 1.0 será deshabilitado el 30 de abril de 2015. Hay una nueva versión disponible?
    • esto no tiene nada que ver con la cuestión aquí. si usted está usando V. 1, a continuación, utilice v. 2 si esto es lo que le pido a hacer, y luego hacerlo.
    • Esa respuesta no hace mucho sentido. Así, usted dice que yo debería abrir una nueva pregunta de cómo cambiar el oauth-cadena a la v2?
    • Una rápida en google me dio esto – developers.facebook.com/docs/apps/upgrading/…
    • En el ejemplo anterior, el 1 de argumento a FB.inicio de sesión es ‘null’… ¿Cuál es el equivalente para los CriOS cuando el 1er argumento de una función anónima que se analiza la respuesta de inicio de sesión?
    • Lo siento, no entiendo la pregunta.
    • Libre de la Yema está preguntando cómo analizar la respuesta de inicio de sesión desde la ventana.abrir. Presumiblemente porque su código tiene una función de devolución de llamada en el FB.función de inicio de sesión. Un limpio receta requeriría mirando el FB login estado en un punto posterior en la aplicación, pero yo personalmente estoy seguro de cómo hacer esto.
    • Para esta solución, ¿ sólo tengo que reemplazar mi Fb código con esto y no hacer cambios en el Fb de la aplicación de la misma?

  3. 5

    Aquí es una completa solución para su FB JS Auth en Chrome iOS problema http://seanshadmand.com/2015/03/06/facebook-js-login-on-chrome-ios-workaround/

    JS funciones para comprobar auth, abrir FB auth página manualmente y actualizar auth token en la página original una vez completa:

    function openFBLoginDialogManually(){
      //Open your auth window containing FB auth page 
      //with forward URL to your Opened Window handler page (below)
    
      var redirect_uri = "&redirect_uri=" + ABSOLUTE_URI + "fbjscomplete";
      var scope = "&scope=public_profile,email,user_friends";
      var url = "https://www.facebook.com/dialog/oauth?client_id=" + FB_ID + redirect_uri + scope;
    
      //notice the lack of other param in window.open
      //for some reason the opener is set to null
      //and the opened window can NOT reference it
      //if params are passed. #Chrome iOS Bug
      window.open(url);
    
    }
    
    function fbCompleteLogin(){
    
      FB.getLoginStatus(function(response) {
        //Calling this with the extra setting "true" forces
        //a non-cached request and updates the FB cache.
        //Since the auth login elsewhere validated the user
        //this update will now asyncronously mark the user as authed
      }, true);
    
    }
    
    function requireLogin(callback){
    
        FB.getLoginStatus(function(response) {
            if (response.status != "connected"){
                showLogin();
            }else{
                checkAuth(response.authResponse.accessToken, response.authResponse.userID, function(success){
                  //Check FB tokens against your API to make sure user is valid
                });
            }
        });
    
    }

    Y el Abridor Controlador de FB auth reenvía y llama a un refresh a la página principal. Nota la ventana.abrir en Chrome iOS tiene bugs, para que así los llaman correctamente como se indicó anteriormente:

    <html>
    <head>
    <script type="text/javascript">
    function handleAuth(){
        //once the window is open 
        window.opener.fbCompleteLogin();
        window.close();    
    }
    </script>
    <body onload="handleAuth();">
        <p>. . . </p>
    </body>
    </head>
    </html>
    • es una buena solución, pero ¿qué es «fbjscomplete» supone que se debe hacer en la url de redirección. Que parece ser redundante.
    • Actualiza el local FB caché en el origen de la página, de modo que el inicio de sesión que se completó en la ventana separada persiste en la primera. La pieza clave de la «fbCompleteLogin» de la función es la de llamar a «FB.getLoginStatus» con el «verdadero» parámetro pasado. Que la «verdadera» param fuerzas de FB de la caché local para actualizar el estado de inicio de sesión (como se registra en) de la página. Sin esta función, la página de FB del SDK de no saber el usuario registra sin actualizar la página. ¿Que sentido?
    • Parece que esto es lo que estoy buscando, pero al ser nuevo en la codificación estoy luchando un poco. Son alrededor de hacerle algunas preguntas adicionales?
    • Cosa segura. Feliz de ayudar. Disparar. 🙂
    • gracias, he hecho lo consiguió trabajo : -), pero sólo con la norma Fb login, no con el análisis. Usted mencionó algo en su blog en el que veía una solución a este para Analizar, ¿en dónde estaba? Yo me cansaría de ver las respuestas anteriores ayudar?
    • Eso es un poco de un error tipográfico. De hecho, he encontrado personas que afirman haber solucionado usando Analizar, pero no podía conseguir algo de trabajo. Lo siento, no tengo el link de la historia ya en este punto 🙁 me Alegro de que tengo trabajo, aunque! También, Usted puede desear agregar algunas notas de lo que había un problema con el y cómo tienes que trabajar para que la próxima persona no tiene que pasar por el mismo calvario. 🙂
    • Hola Sean. Tengo el mismo problema. Pero el código no está funcionando para mí. usted está llamando fbCompleteLogin(); la cual sólo se obtiene estado de inicio de sesión. donde va a llamar a otras funciones?
    • El flujo de trabajo es: la Llamada «openFBLoginDialogManually». Que se abre el FB generado página de inicio de sesión. La dirección URL pasó a FB página de inicio de sesión incluye una redirección a la apertura del Controlador de un fragmento de código HTML anterior. Que páginas HTML que llama a la original del abridor «fbCompleteLogin». En ese momento todo lo que hace es actualizar el local FB caché de inicio de sesión con credenciales nuevas. El «requireLogin» es innecesario y molesto, lo siento. Espero que ayude. Si no me deja saber más específicamente donde se están encontrando con un problema.

  4. 0

    Mis 2 centavos en esto como nadie de las respuestas fueron claras para mí. Im disparar el inicio de sesión js cuadro de diálogo haga clic en un botón, así que ahora cuando chrome ios puedo comprobar primero si el usuario que ha iniciado sesión en facebook y si no se los puedo mandar a la ventana de inicio de sesión. El problema con esto es que chome los usuarios de ios necesidades clic en conectar botón dos veces si no ha iniciado sesión en facebook. Si se ha iniciado sesión en facebook un clic es suficiente.

     $( 'body' ).on( 'click', '.js-fbl', function( e ) {
            e.preventDefault();
    
            if( navigator.userAgent.match('CriOS') ) {
                //alert users they will need to click again, don't use alert or popup will be blocked
                $('<p class="fbl_error">MESSAGE HERE</p>').insertAfter( $(this));
                FB.getLoginStatus( handleResponse );
            } else {
                //regular users simple login
                try {
                    FB.login( handleResponse , {
                        scope: fbl.scopes,
                        return_scopes: true,
                        auth_type: 'rerequest'
                    });
                } catch (err) {
                    $this.removeClass('fbl-loading');
    
                }
            }
        });

    Que el bit de código funciona para google chrome, los usuarios de ios. En la manija de la respuesta que me tome el cuidado de fb respuesta y enviarlo a mi sitio web backend para inicio de sesión/registro de usuarios.

    var handleResponse = function( response ) {
        var $form_obj       = window.fbl_button.parents('.flp_wrapper').find('form') || false,
            $redirect_to    = $form_obj.find('input[name="redirect_to"]').val() || window.fbl_button.data('redirect');
        /**
         * If we get a successful authorization response we handle it
         */
        if (response.status == 'connected') {
    
            var fb_response = response;
    
            /**
             * Make an Ajax request to the "facebook_login" function
             * passing the params: username, fb_id and email.
             *
             * @note Not all users have user names, but all have email
             * @note Must set global to false to prevent gloabl ajax methods
             */
            $.ajax({...});
    
        } else {
             //if in first click user is not logged into their facebook we then show the login window
             window.fbl_button.removeClass('fbl-loading');
            if( navigator.userAgent.match('CriOS') )
                window.open('https://www.facebook.com/dialog/oauth?client_id=' + fbl.appId + '&redirect_uri=' + document.location.href + '&scope=email,public_profile', '', null);
        }
    };

    Espero que ayude!

  5. 0

    No es una verdadera respuesta, pero basado en este hilo la pena señalar que se comenzó a trabajar para nuestra aplicación, en Chrome cuando en el iPhone hicimos General>Reset>Reset Location & Privacy

  6. 0

    Tengo una solución para ios facebook sitio web de inicio de sesión en google chrome . En realidad el problema era con google chrome en ios cuando hacemos clic en facebook botón de inicio de sesión se dan internamente null a la ventana.abrir chrome en ios .

    No son dos soluciones, ya sea para comprobar que es chrome en ios(chrios) y, a continuación, generar personalizados de la pantalla de inicio de sesión ( todavía no en la casualidad que nos correcta ).

    Segundo lo he usado. Es el uso de facebook de inicio de sesión de revés crear una api de golpe va a llenar facebook de la pantalla y, a continuación, cuando de inicio de sesión, se le redirigirá a su servidor desde donde se redireccionará a la página web con la página de facebook de datos.

    otro beneficio de ello es la creación de 2 sitio web para el mismo propietario del sitio web no se puede establecer dos url del sitio web en facebook cuenta de desarrollador .De esta manera usted puede crear muchos sitio web de facebook de inicio de sesión con el mismo facebook appid .

    • Por lo que he encontrado, el navegador Chrome tiene un Crios y no Chrios nombre en su navegación cadena.
  7. 0

    Este es un tema muy común que todos los desarrolladores se han enfrentado en la aplicación del FB función de inicio de sesión. He probado la mayoría de las soluciones de Internet, pero ninguno de ellos funcionó. Ya sea window.opener no funciona en Chrome en iOS o en algún momento FB objeto no está cargado, mientras que el uso de /dialog/oauth.

    Finalmente lo resuelto por mí mismo después de intentar todos los hacks!

    function loginWithFacebook()
    {
      if( navigator.userAgent.match('CriOS') )
      {
        var redirect_uri = document.location.href;
        if(redirect_uri.indexOf('?') !== -1)
        {
          redirect_uri += '&back_from_fb=1';
        }
        else
        {
          redirect_uri += '?back_from_fb=1';
        }
        var url = 'https://www.facebook.com/dialog/oauth?client_id=[app-id]&redirect_uri='+redirect_uri+'&scope=email,public_profile';
        var win = window.open(url, '_self');
      }
      else
      {
        FB.login(function(response)
          {
            checkLoginState();
          },
          {
            scope:'public_profile,email,user_friends,user_photos'
          });
      }
    }

    Aviso que encima estoy pasando un extra de parámetro a la url de redirección, de modo que una vez que se abra la ventana nueva con la anterior redirigir uri podía leer los valores de y se puede decir que sí a esta llamada es de Chrome iOS ventana. También asegúrese de que este código se ejecuta al cargar la página.

    if (document.URL.indexOf('back_from_fb=1') != -1 && document.URL.indexOf('code=') != -1)
    {
      pollingInterval = setInterval(function()
        {
          if(typeof FB != "undefined")
          {
            FB.getLoginStatus(function(response) {}, true);
            checkLoginState();
          }
          else
          {
            alert("FB is not responding, Please try again!", function()
              {
                return true;
              });
          }
        }, 1000);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here