Crear un login facebook php mysql (Demostración y Descarga)

DEMOSTRACIÓN Y DESCARGA

Saludos amigos esta vez implementaremos un login facebook php mysql en nuestra web, para esta demostración crearemos una variable de sesión que nos permitirá verificar si el usuario a iniciado sesión y permitirá acceder a archivos ocultos,los cuales solo pueden ser visto por usuarios registrados en nuestra web.

Utilizaremos el SDK PHP de facebook que se encuentra en los repositorios de github . Antes de continuar hay que tener en cuenta que facebook nos debe proporcionar credenciales para acceder a los datos de un usuario. Puedes consultar una documentación oficial aquí.

Pasos para tener una credencial:

1.- Acceder a developers.facebook.com

1.- Crear una aplicación

2.- En configuraciones (Deberás llenar los datos requeridos por facebook)

3.- En productos deberás solicitar el inicio de sesión con Facebook (Configurar a conveniencia)

4.- Deberás activar la aplicación

Hay que tener en cuenta que en los permisos y funciones de facebook, para la función email no necesitas solicitar revisión.
se podría obtener el email de forma predeterminada, aunque esto no garantiza que lo obtengamos ya que si los usuaros se han registrado con un número de teléfono , nosotros obtendríamos un campo vacío dentro de nuestra base de datos.
dentro de los campos predeterminados tenemos los siguientes:

  • id
  • first_name
  • last_name
  • middle_name
  • name
  • name_format
  • picture
  • short_name

Estos campos no necesitan revisión y podemos hacer la llamada de datos de forma segura. Aquí el mas importante sería el id del usuario que es el que le asigna facebook y es por el cual vamos a crear nuestra condición de verificación.

Bueno una vez explicado este intro comenzamos con lo nuestro.
Asi es la estructura utilizada por el creador MVC.

Archivos a utilizar

Vamos a mencionar los mas importantes ,los cuales están documentados.

  • index.php
  • config.php
  • public/setup.php
  • model/idiorm.php
  • view/index.php
  • view/inc/nosesion.php
  • controller/index.php
  • controller/logout.php

index.php

Aquí cargaremos el front del sitio.

  //ext file
  $ext = substr(strrchr(__FILE__, '.'), 1);

  /** Define ROOT_PATH para directorio app */
  if ( ! defined( 'ROOT_PATH' ) ) {
    define( 'ROOT_PATH', dirname(__FILE__) . '/' );
  }

  //requerimos la configuracion del host
  require ( ROOT_PATH . 'config.php' );

  //requerimos el modelo para ser utilizado en el sitio
  require ( ROOT_PATH . 'model/idiorm.php' );

  //requerimos SetUp.php la configuración de facebook (credenciales)
  require ( ROOT_PATH . 'public/SetUp.php' );

  //iniciamos vistas del front
  //si obtenemos una vista la mostramos ejemplo: http://dominio.com/?view=singlepost
  if(isset($_GET['view'])) {
     if(file_exists( ROOT_PATH . 'controller/' . strtolower($_GET['view']) .'.'. $ext )) {
       include( ROOT_PATH . 'controller/' . strtolower($_GET['view']) .'.'. $ext );
     } else {
       //si no encontramos la vista mostramos un error
       include( ROOT_PATH.'controller/404.php');
     }
   } else {
     //si no mostramos nada ,se mostrará el index por defecto
     include( ROOT_PATH.'controller/index.php');
   }
   //end front

config.php

Aquí cargaremos las configuraciones de tu hosting solocitalas a tu proveedor.

  // ** Ajustes de MySQL. Solicita estos datos a tu proveedor de alojamiento web. ** //
  /** El nombre de tu base de datos */
  define( 'DB_NAME', 'base datos' );

  /** Tu nombre de usuario de MySQL */
  define( 'DB_USER', 'usuario' );

  /** Tu contraseña de MySQL */
  define( 'DB_PASS', 'password' );

  /** Host de MySQL (es muy probable que no necesites cambiarlo) */
  define( 'DB_HOST', 'localhost' );

  /** Codificación de caracteres para la base de datos. */
  define( 'DB_CHARSET', 'utf8mb4' );

public/setup.php

Aquí cargaremos la configuración de las credenciales que nos otorga facebook.

/*Autoload facebook */
require_once 'sdk-facebook/autoload.php';

/**************Facebook API****************/
// librerias facebook
use Facebook\Facebook;
use Facebook\Exceptions\FacebookResponseException;
use Facebook\Exceptions\FacebookSDKException;

//llaves de facebook verifique en https://developers.facebook.com/
$appId         = ''; //Identificador de la Aplicación
$appSecret     = ''; //Clave secreta de la aplicación
$redirectURL   = ''; //Callback URL
$fbPermissions = array('');  //Permisos opcionales

//creamos var fb y almacenamos el array de credenciales
$fb = new Facebook(array(
    'app_id' => $appId,
    'app_secret' => $appSecret,
    'default_graph_version' => 'v2.9',
));

// Obtener el apoyo de logueo
$helper = $fb->getRedirectLoginHelper();

// obtener el token
try {
    if(isset($_SESSION['facebook_access_token'])){
        $accessToken = $_SESSION['facebook_access_token'];
    }else{
          $accessToken = $helper->getAccessToken();
    }
} catch(FacebookResponseException $e) {
     echo 'Graph returned an error: ' . $e->getMessage();
      exit;
} catch(FacebookSDKException $e) {
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
      exit;
}
/************end facebook api***************/
//Utilizamos la clase ORM de idiorm class
ORM::configure("mysql:host=".DB_HOST.";dbname=".DB_NAME);
ORM::configure('username', DB_USER);
ORM::configure('password', DB_PASS);
// cambiamos el juego de caracteres
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.DB_CHARSET));

model/idiorm.php

Es una librería php/pdo rápida y ligera que nos permite utilizar las sentencias preparadas.

view/index.php

Aquí se mostrará información del usuario una vez que se haya iniciado sesión con el botón de
facebook. Nótese cómo con el array $person nos sirve para obtener datos con el campo de la tabla ejm.
$person->picture == foto de perfil de usuario de facebook.

  <div class="main-content">
    <div class="container">
      <div class="row">
        <div class="col-md-12">

          <div class="text-center mb-4">
            <h1 class="h3 mb-3 font-weight-normal">Iniciar Sesión</h1>
            <p>Creando un registro de usuarios en nuestro sitio con <code>Facebook</code></p>
            <p></p>
          </div>

          <div class="cp-login-box">

            <div class="user-pic"><img src="<?php echo $person->picture; ?>" alt=""></div>
              <div class="cp-login-form">
                <form class="material">
                <ul>
                  <li class="input-group"> <span class="input-group-addon"><i class="fa fa-user"></i></span>
                  <div class="material-input input"><input type="text" class="form-control" placeholder="<?php echo htmlspecialchars($person->first_name)?> <?php echo htmlspecialchars($person->last_name)?>" disabled><span class="material-bar"></span></div>
                  </li>
                  <li>
                    <?php
                    // Obtener el url para cerrar sesión
                    $logoutURL = $helper->getLogoutUrl($accessToken, $redirectURL.'?view=logout&logout=desconectar');
                    ?>

                  <a href="<?php echo $logoutURL; ?>"class="btn btn-submit waves-effect waves-button">Cerrar sesión</a>
                  </li>
                </ul>
                </form>
                <div class="signup">
                <span>Su registro fue : <?php echo get_date_time($person->registered); ?></span><br>
                <a href="" target="_blank">descargar.!</a>
                </div>
            </div>

          </div>

        </div>
      </div>
    </div>
  </div><!--main-content-->

view/inc/nosesion.php

Esta página se mostrará si el usuario no a iniciado sesión y se mostrará el botón de facebook.

  <div class="main-content">
    <div class="container">
      <div class="row">
        <div class="col-md-12">

          <div class="text-center mb-4">
            <h1 class="h3 mb-3 font-weight-normal">Iniciar Sesión</h1>
            <p>Creando un registro de usuarios en nuestro sitio con <code>Facebook</code></p>
            <p></p>
          </div>

          <div class="cp-login-box">
            <div class="user-pic"><img src="view/assets/img/usuario.jpg" alt=""></div>
              <div class="cp-login-form">
                <ul class="cp-social-login">
                  <li><h4>Inicie sesión con</h4></li>
                  <li>
                  <a href="<?php echo $loginURL; ?>"><img src="view/assets/img/fb.jpg" alt=""></a>
                  </li>
                </ul>
                <div class="signup">
                <a>Inicie sesión para descargar.!</a>
                </div>
            </div>
          </div>

        </div>
      </div>
    </div>
  </div><!--main-content-->

controller/index.php

 

Aquí crearemos las funciones de facebook para acceder al token y mantener la sesión activa
además que verificaremos si el usuario está registrado , si no está con la función save lo Registramos
y continuamos con la aplicación. Nótese que realizamos la consulta por id de usuario y no por email.

Nótese cómo nos solicita acceder a la aplicación desde facebook.

if(isset($accessToken)){
  if(isset($_SESSION['facebook_access_token'])){
      $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
  }else{
      // Token de acceso de corta duración en sesión
      $_SESSION['facebook_access_token'] = (string) $accessToken;

        // Controlador de cliente OAuth 2.0 ayuda a administrar tokens de acceso
      $oAuth2Client = $fb->getOAuth2Client();

      // Intercambia una ficha de acceso de corta duración para una persona de larga vida
      $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);
      $_SESSION['facebook_access_token'] = (string) $longLivedAccessToken;

      // Establecer token de acceso predeterminado para ser utilizado en el script
      $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
  }

  // Redirigir el usuario de nuevo a la misma página si url tiene "code" parámetro en la cadena de consulta
  if(isset($_GET['code'])){
      header('Location: ./');
  }
  // Obtener información sobre el perfil de usuario facebook
  try {
      $profileRequest = $fb->get('/me?fields=name,first_name,last_name,email,picture');
      $fbUserProfile = $profileRequest->getGraphNode()->asArray();
  } catch(FacebookResponseException $e) {
      echo 'Graph returned an error: ' . $e->getMessage();
      session_destroy();
      // Redirigir usuario a la página de inicio de sesión de la aplicación
      header("Location: ./");
      exit;
  } catch(FacebookSDKException $e) {
      echo 'Facebook SDK returned an error: ' . $e->getMessage();
      exit;
  }

  // datos de usuario que iran a  la base de datos
  $fbUserData = array(
      'oauth_uid'     => $fbUserProfile['id'],
      'first_name'    => $fbUserProfile['first_name'],
      'last_name'     => $fbUserProfile['last_name'],
      'email'         => $fbUserProfile['email'],
      'picture'       => $fbUserProfile['picture']['url']
  );
  // buscamos este usuario en la base de datos
    $person = ORM::for_table('facebook_users')->where('oauth_uid', $fbUserData['oauth_uid'])->find_one();

  if(!$person){
        // usuario no encontardo. Registramos!
        $person = ORM::for_table('facebook_users')->create();

        // Configuramos propiedades que se insertarán en la base de datos //aray de database
        $person->oauth_uid = $fbUserData['oauth_uid'];
    $person->first_name = $fbUserData['first_name'];
    $person->last_name = $fbUserData['last_name'];
    $person->email = $fbUserData['email'];
    $person->picture = $fbUserData['picture'];
    $person->registered = date ("Y-m-d H:i:s");

        // grabamos al usuario en la dB
        $person->save();
    }

  // guaradamos la sesion de usuario de la ultima consulta
  $_SESSION['demo_sesion_facebook'] = $person->id();

}else{
  $loginURL = $helper->getLoginUrl($redirectURL, $fbPermissions);
}
$person = null;
if(isset($_SESSION['demo_sesion_facebook'])){
  // obtenemos datos de usuario de la base de datos con el id del usuario de facebook session
    $person = ORM::for_table('facebook_users')->find_one($_SESSION['demo_sesion_facebook']);
  require_once('view/index.php');
}else{
  require_once('view/inc/nosesion.php');
}

Tabla.sql

Tabla utilizada para esta demostración.

  CREATE TABLE `facebook_users` (
  `id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `oauth_uid` varchar(100) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `first_name` varchar(50) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `last_name` varchar(50) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `email` varchar(100) COLLATE utf8mb4_spanish2_ci DEFAULT NULL,
  `picture` varchar(255) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish2

La ventaja de tener un registro de usuario con un solo clic usando login facebook php mysql, es que ahorramos al usuario
los fastidiosos formularios y no necesitamos validar información.

Espero les sirva en algún proyecto nos vemos hasta la próxima.


Relacionado