entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Inicio de sesión con Facebook

Estoy desarrollando un inicio de sesión con facebook usando javascript.

El caso es el siguiente, cuando inicias sesión con facebook, te cambia el botón y se activa el de Logout, Pero quiero que cuando inicie sesión me rediriga a otro archivo php para poder gestionar los datos del usuario e introducirlos en la Base de Datos.

Los usuarios que se registran normal van a un archivo php donde me introduce los datos en la BD y ese archivo con ajax me redirige dentro de la web.

Quiero hacer lo mismo pero con Facebook.

Os dejo el código Javascript:

<script>
                            // Constantes de control de estado en Facebook
                            // https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
                            var APP_ID = 'XXXXXXXXXXXXXXXXXXXXXX';
                            var CHANNEL_URL= 'XXXXXXXXXXXXXXX';
                            var STATUS_CONNECTED = 'connected';
                            var STATUS_NOT_AUTHORIZED = 'not_authorized';
                            var STATUS_UNKNOWN = 'unknown';
                            var PERMISSIONS  = {scope: 'email, user_about_me, user_birthday, publish_stream'};

                            var uid;
                            var accessToken;
                            var isLogginProcess = false;

                            function writeOutput(msg)
                            {
                                var $output = $('.output');
                                var content = $output.html();
                                $('.output').html(content + msg + '<br/>');
                            }       

                            function doLogin (ev)
                            {
                                writeOutput('Solicitando login...');
                                isLogginProcess = true;
                                FB.login(controlarStatus, PERMISSIONS);
                            }

                            function doAuthorize (ev)
                            {
                                writeOutput('Solicitando autorización...');
                                isLogginProcess = true;
                                FB.login(controlarStatus, PERMISSIONS);
                            }

                            function doLogout (ev)
                            {
                                writeOutput('Solicitando logout...');
                                FB.logout(controlarStatus);
                            }

                            function authResponseChange (respuesta)
                            {
                                writeOutput('Evento AuthResponseChange: '+respuesta.status);
                                controlarStatus(respuesta);
                            }

                            function statusChange (respuesta)
                            {
                                writeOutput('Evento StatusChange: '+respuesta.status);
                                controlarStatus(respuesta);
                            }

                            function controlarStatus(respuesta)
                            {
                                if (respuesta.authResponse)
                                {
                                    writeOutput('Control status (con respuesta): '+respuesta.status);
                                    if (respuesta.status === STATUS_CONNECTED) 
                                    {
                                        /* 
                                            El usuario está logueado y además ha sido autenticado por
                                            la aplicación. En este caso, respuesta.authResponse contiene el ID 
                                            del usuario, un token de acceso válido, una petición firmada y el momento
                                            en que el token de acceso y la petición firmada caducarán
                                        */

                                        // Podriamos guardar datos como el userID y el token de acceso
                                        uid = respuesta.authResponse.userID;
                                        accessToken = respuesta.authResponse.accessToken;

                                        $('#logout').show();
                                        $('#authorize').hide();
                                        $('#login_facebook').hide();
                                    } 
                                    else if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {
                                        /*
                                            El usuario está logueado en Facebook, pero no ha sido autenticado
                                            por la aplicación. Se debería permitir mediante un botón o enlace (si se
                                            hace de forma automática, el cuadro de diálogo puede ser interpretado como 
                                            un popup a bloquear).
                                        */
                                        $('#authorize').show();
                                        $('#logout').show();
                                        $('#login_facebook').hide();
                                    } 
                                    else 
                                    {
                                        // El usuario no está logueado en Facebook
                                        $('#login_facebook').show();
                                        $('#authorize').hide();
                                        $('#logout').hide();
                                    }
                                }
                                else
                                {
                                    writeOutput('Control Status (sin respuesta): '+respuesta.status);

                                    if (isLogginProcess)
                                    {
                                        // Si el usuario viene de un proceso de login, es posible que 
                                        // haya dado a cancelar en la ventana, por lo que internamente
                                        // solicitamos un nuevo control de estado del usuario
                                        // El parámetro true es fundamental para que la petición no se
                                        // cachee, y por tanto obtengamos el estado real
                                        isLogginProcess = false;
                                        FB.getLoginStatus(controlarStatus, true);
                                    }

                                    if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {                   
                                        $('#authorize').show();
                                        $('#login_facebook').hide();
                                        $('#logout').hide();
                                    }
                                    else 
                                    {
                                        $('#login_facebook').show();
                                        $('#authorize').hide();                 
                                        $('#logout').hide();
                                    }
                                }

                                writeOutput('----------------------------------');
                            }

                            function init()
                            {
                                // FB.Event.subscribe('auth.login', controlarStatus);
                                // FB.Event.subscribe('auth.statusChange', statusChange);
                                FB.Event.subscribe('auth.authResponseChange', authResponseChange);

                                FB.getLoginStatus(controlarStatus, true);

                                $('#login_facebook').on('click', doLogin);
                                $('#authorize').on('click', doAuthorize);
                                $('#logout').on('click', doLogout);
                            }

                            /*
                            ** Versión de uso convencional
                            ** que no dependiera de jQuery
                            */
                            window.fbAsyncInit = function() {
                                // Inicialización del SDK JavaScript para Facebook
                                FB.init({
                                  appId     : APP_ID,       // App ID para conexión con Facebook
                                  channelUrl: CHANNEL_URL,  // Ruta al fichero channel para cross-domain
                                  status    : false,        // Comprobar el estado de login de inicio
                                  xfbml     : true          // true para compatibilidad con social plugins
                                });

                                // Aquí, ya podemos inicializar nuestros procesos
                                init();         
                            }; 

                            // Carga del SDK de forma asíncrona
                            (function(d, s, id) {
                                var js, fjs = d.getElementsByTagName(s)[0];
                                if (d.getElementById(id)) {return;}
                                js = d.createElement(s); js.id = id;
                                js.src = "//connect.facebook.net/es_ES/all.js";
                                fjs.parentNode.insertBefore(js, fjs);
                            }(document, 'script', 'facebook-jssdk')); // */
                            </script>

0voto

carlossevi comentado

¿Dónde te falla? ¿Cuál es la duda?

0voto

danielreales7 comentado

No es que me falle, sino que quiero que cuando inicie sesión, me introduzca los datos que necesite en la BD y me rediriga a otra página. No sé exactamente en que parte debo hacer eso.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Daniel,

podés poner una llamada ajax a un script PHP enviando los datos del usuario. Ese script, de forma asincrónica, podría guardarlos, etc.

La llamada la tenés que poner en el if que verificó que el loguea fue correcto (posiblemente después de un $('#logout').show();

Se me ocurre que esto es lo más simple y no te cambia en nada la lógica de autentificación.

Saludos!

0voto

danielreales7 comentado

Vale perfecto, el caso es que cuando quería mostrar el nombre, etc, haciéndolo en el if que verifica que es correcto me lo mostraba 2 veces.

Entiendo que haciendo una llamada por ajax podré hacerlo, muchas gracias!

0voto

danielreales7 comentado

Mira, estoy haciendo la llamada justo debajo con esto:

FB.api('/me', function(response) {
                                          var dataFacebook = "username="+response.name;
                                          $.ajax({
                                            type: "POST",
                                            url: "php/registro-facebook.php", //Mando a ajaxdatos.php
                                            data: dataFacebook, //La cedula
                                            success: function(data) {
                                                if(data == 'error'){ //Si ajaxdatos.php me devuelve algo
                                                    $('#error_acceso').show();
                                                    $('#error_acceso').html(data); //Muestro un alert
                                                }else{ //si no me devuelve nada el ajaxdatos.php (porque no valido los datos)
                                                    $('#abrirAcceder').modal('hide'); //oculto el modal de cedula
                                                    $('#error_acceso').hide(); //oculto el modal de cedula
                                                    urlWeb = "http://www.aliquapp.com/chatiic/?seccion=perfil";
                                                    //$(location).attr('href',urlWeb);
                                                }
                                            }
                                          });
                                        });

El caso es que me está redireccionando cada segundo a la página de perfil, e incluso no me muestra ni el nombre del usuario.

0voto

Leonardo-Tadei comentado

Daniel,

supongo que data no devuelve error o que estás entrando varias veces a evaluar esta función en vez de solo una.

Si hay varios eventos asincrónicos, puede ser que algunos no se enteren que otros están corriendo y no terminaron... podrías poner una variable más global y llevar la cuenta de las veces que hacés la autentificación contra FB, para ver si se está haciendo más de una vez.

Esta porción de código no tiene, a simple vista, nada extraño... pero mucho de esto depende del funcionamiento del resto.

Saludos!

0voto

danielreales7 comentado

Sí Leonardo cierto, ya me devuelve los datos que necesito, pero como te dije me sigue recargando la página cada segundo al estar haciendo llamadas a través de ajax, donde tendría que cambiar para que no me suceda eso?

Gracias!

0voto

Leonardo-Tadei comentado

Hola Daniel,

las llamadas AJAX no recargan la página! Debe ser otra cosa....

Podrías copiar y pegar todo el código JS o ponerlo en JSFiddle para que lo podamos ver?

Tal vez si lo hacés en otra pregunta "por qué se recarga esta página?" se apunten más a ver qué es lo que te puede estar pasando (esto queda muy abajo y tal vez no se llegue a leer por algunos). A mi me da lo mismo seguir acá.

Saludos!

0voto

danielreales7 comentado

Sí me he explicado mal Leonardo, es del archivo php al que hago la llamada que hay quiero procesar los datos, es decir, almacenarlos en la base de datos iniciar la sesión del usuario y hago un header("Location: .....") a la página que desee, que en este caso es el perfil del usuario.

Pero me hace llamadas constantes y sigue recargando la página.

Pero creo que ya sé también por lo que es, y es que no inicio, la sesión y entonces intenta ir a perfil y no te deja entrar debido a que no existe la sesión, entonces se hace un bucle ahí.

0voto

danielreales7 comentado

Mira Leonardo, me hace todo correctamente, te dejo el código de los dos archivos:

<script>
                            // Constantes de control de estado en Facebook
                            // https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
                            var APP_ID = 'XXXXXXXXXXXXXX';
                            var CHANNEL_URL= 'XXXXXXXXXX';
                            var STATUS_CONNECTED = 'connected';
                            var STATUS_NOT_AUTHORIZED = 'not_authorized';
                            var STATUS_UNKNOWN = 'unknown';
                            var PERMISSIONS  = {scope: 'email, user_about_me, user_birthday, publish_stream'};

                            var uid;
                            var accessToken;
                            var isLogginProcess = false;

                            function writeOutput(msg)
                            {
                                var $output = $('.output');
                                var content = $output.html();
                                $('.output').html(content + msg + '<br>');
                            }       

                            function doLogin (ev)
                            {
                                //writeOutput('Solicitando login...');
                                isLogginProcess = true;
                                FB.login(controlarStatus, PERMISSIONS);
                            }

                            function doAuthorize (ev)
                            {
                                //writeOutput('Solicitando autorización...');
                                isLogginProcess = true;
                                FB.login(controlarStatus, PERMISSIONS);
                            }

                            function doLogout (ev)
                            {
                                //writeOutput('Solicitando logout...');
                                FB.logout(controlarStatus);
                            }

                            function authResponseChange (respuesta)
                            {
                                //writeOutput('Evento AuthResponseChange: '+respuesta.status);
                                controlarStatus(respuesta);
                            }

                            function statusChange (respuesta)
                            {
                                //writeOutput('Evento StatusChange: '+respuesta.status);
                                controlarStatus(respuesta);
                            }

                            function controlarStatus(respuesta)
                            {
                                if (respuesta.authResponse)
                                {   
                                    //writeOutput('Control status (con respuesta): '+respuesta.status);
                                    if (respuesta.status === STATUS_CONNECTED) 
                                    {
                                        /* 
                                            El usuario está logueado y además ha sido autenticado por
                                            la aplicación. En este caso, respuesta.authResponse contiene el ID 
                                            del usuario, un token de acceso válido, una petición firmada y el momento
                                            en que el token de acceso y la petición firmada caducarán
                                        */

                                        // Podriamos guardar datos como el userID y el token de acceso
                                        uid = respuesta.authResponse.userID;
                                        accessToken = respuesta.authResponse.accessToken;

                                        $('#logout').show();
                                        $('#authorize').hide();
                                        $('#login_facebook').hide();

                                        FB.api('/me', function(response) {
                                          var dataFacebook = "username="+response.name+"&token="+accessToken+"&email="+response.email+"&nombre="+response.first_name+"&sexo="+response.gender+"&nacimiento="+response.user_birthday;
                                          $.ajax({
                                            type: "POST",
                                            url: "php/registro-facebook.php", //Mando a ajaxdatos.php
                                            data: dataFacebook, //La cedula
                                            success: function(data) {
                                                if(data == 'registroOK'){ //Si ajaxdatos.php me devuelve algo
                                                    $('#abrirAcceder').modal('hide'); //oculto el modal de cedula
                                                    $('#error_acceso').hide(); //oculto el modal de cedula
                                                    urlWeb = "XXXXXXXXX";
                                                    $(location).attr('href',urlWeb);
                                                }else{ //si no me devuelve nada el ajaxdatos.php (porque no valido los datos)
                                                    $('#abrirAcceder').modal('hide'); //oculto el modal de cedula
                                                    $('#error_acceso').hide(); //oculto el modal de cedula
                                                    urlWeb = "XXXXXXXXX";
                                                    $(location).attr('href',urlWeb);
                                                }
                                            }
                                          });
                                        });

                                        //window.location.href="http://www.aliquapp.com/chatiic/php/registro-facebook.php";
                                    } 
                                    else if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {
                                        /*
                                            El usuario está logueado en Facebook, pero no ha sido autenticado
                                            por la aplicación. Se debería permitir mediante un botón o enlace (si se
                                            hace de forma automática, el cuadro de diálogo puede ser interpretado como 
                                            un popup a bloquear).
                                        */
                                        $('#authorize').show();
                                        $('#logout').show();
                                        $('#login_facebook').hide();
                                    } 
                                    else 
                                    {
                                        // El usuario no está logueado en Facebook
                                        $('#login_facebook').show();
                                        $('#authorize').hide();
                                        $('#logout').hide();
                                    }
                                }
                                else
                                {
                                    //writeOutput('Control Status (sin respuesta): '+respuesta.status);

                                    if (isLogginProcess)
                                    {
                                        // Si el usuario viene de un proceso de login, es posible que 
                                        // haya dado a cancelar en la ventana, por lo que internamente
                                        // solicitamos un nuevo control de estado del usuario
                                        // El parámetro true es fundamental para que la petición no se
                                        // cachee, y por tanto obtengamos el estado real
                                        isLogginProcess = false;
                                        FB.getLoginStatus(controlarStatus, true);
                                    }

                                    if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {                   
                                        $('#authorize').show();
                                        $('#login_facebook').hide();
                                        $('#logout').hide();
                                    }
                                    else 
                                    {
                                        $('#login_facebook').show();
                                        $('#authorize').hide();                 
                                        $('#logout').hide();
                                    }
                                }

                                //writeOutput('----------------------------------');
                            }

                            function init()
                            {
                                // FB.Event.subscribe('auth.login', controlarStatus);
                                // FB.Event.subscribe('auth.statusChange', statusChange);
                                FB.Event.subscribe('auth.authResponseChange', authResponseChange);

                                FB.getLoginStatus(controlarStatus, true);

                                $('#login_facebook').on('click', doLogin);
                                $('#authorize').on('click', doAuthorize);
                                $('#logout').on('click', doLogout);
                            }

                            /*
                            ** Versión de uso convencional
                            ** que no dependiera de jQuery
                            */
                            window.fbAsyncInit = function() {
                                // Inicialización del SDK JavaScript para Facebook
                                FB.init({
                                  appId     : APP_ID,       // App ID para conexión con Facebook
                                  channelUrl: CHANNEL_URL,  // Ruta al fichero channel para cross-domain
                                  status    : false,        // Comprobar el estado de login de inicio
                                  xfbml     : true          // true para compatibilidad con social plugins
                                });

                                // Aquí, ya podemos inicializar nuestros procesos
                                init();                                 
                            }; 

                            // Carga del SDK de forma asíncrona
                            (function(d, s, id) {
                                var js, fjs = d.getElementsByTagName(s)[0];
                                if (d.getElementById(id)) {return;}
                                js = d.createElement(s); js.id = id;
                                js.src = "//connect.facebook.net/es_ES/all.js";
                                fjs.parentNode.insertBefore(js, fjs);
                            }(document, 'script', 'facebook-jssdk')); // */
                            </script>

0voto

danielreales7 comentado

Y ahora te dejo el archivo registro-facebook.php que no me cabía en el otro comentario:

<?php
date_default_timezone_set("Europe/Madrid"); 
include('conexion.php');
require 'encriptacion_password/PasswordHash.php';

$username = $_POST["nombre"];
$password = $_POST["token"];
$email = $_POST["email"];
$nombre_completo = $_POST["username"];
$sexo = $_POST["sexo"];
$fecha_alta = date('Y-m-d H:i:s');
$nacimiento = $_POST["nacimiento"];

$t_hasher = new PasswordHash(8, TRUE);
$hash = $t_hasher->HashPassword($passwd);

$sql = "SELECT * FROM T_USUARIOS WHERE EMAIL = '$email'";
$resultado = mysqli_query($conexion, $sql);
$row = mysqli_fetch_array($resultado);

if($row){
    session_start();
    $_SESSION['id_usuario'] = $row["ID"];
    $_SESSION['nombre_completo'] = $row["NOMBRE_COMPLETO"];
    $_SESSION['email_user'] = $row["EMAIL"]; 
    $_SESSION['nacimiento'] = $row["FECHA_NACIMIENTO"];
    $_SESSION['sexo'] = $row["SEXO"];
    $_SESSION['buscando'] = $row["BUSCANDO"];
    $_SESSION['estado_civil'] = $row["ESTADO_CIVIL"];
    $_SESSION['ciudad'] = $row["CIUDAD"];
    $_SESSION['provincia'] = $row["ID_PROVINCIA"];
    $_SESSION['pais'] = $row["ID_PAIS"];
    $_SESSION['foto_perfil'] = $row["FOTO_PERFIL"];
    $_SESSION['me_apasiona'] = $row["ME_APASIONA"];
    $_SESSION['busco_en_persona'] = $row["BUSCO_EN_PERSONA"];
    $_SESSION['descripcion'] = $row["DESCRIPCION"];
    $_SESSION['sobre_mi'] = $row["SOBRE_MI"];
    echo "correcto";
}else{
    $sql2 = "INSERT INTO T_USUARIOS (USUARIO,PASSWD,USER_NICENAME,EMAIL,F_ALTA,USER_ACTIVATION_KEY,ESTADO,NOMBRE_COMPLETO,F_BAJA,F_MODIF,FECHA_NACIMIENTO,SEXO,BUSCANDO,ID_PROVINCIA,ID_PAIS,ESTADO_CIVIL,CIUDAD,ME_APASIONA,BUSCO_EN_PERSONA,DESCRIPCION) VALUES ('$username','$hash','$username','$email','$fecha_alta',null,0,'$nombre_completo',null,'$fecha_alta','$nacimiento','$sexo',null,0,0,null,0,null,null,null)";
    $resultado2 = mysqli_query($conexion,$sql2);
    echo "registerOK";
}

?>

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta