Login con Twitter en CodeIgniter

Twitter es una de las redes sociales más populares y más utilizadas. Millones de personas de todo el mundo están conectadas vía Twitter. Adaptar el login de Twitter a tu proyecto suele ser siempre una buena idea, ya que hace que el hecho de hacer login sea más sencillo para el usuario. La principal función de insertar el login de Twitter en cualquier proyecto es que el usuario no necesite crearse una cuenta para ingresar en tu sitio web. A partir de ese momento podrán iniciar sesión en tu sitio web con su cuenta de Twitter.

En este tutorial te mostraremos cómo integrar el login de Twitter en CodeIgniter utilizando la librería OAuth PHP de Twitter que permite que cualquier usuario inicie sesión con Twitter en aplicaciones desarrolladas con CodeIgniter.

Crear la app de Twitter

Necesitamos la Consumer Key y la Consumer Secret para utilizarla en la librería OAuth, y para ello debemos crear una app en Twitter.

  • Ve a la página web de Twitter destinada para ello y loguéate como usuario
  • Introduce la siguiente información para crear la app de Twitter. Nombre: El nombre de tu aplicación. Descripción: Algo que defina a tu aplicación. Website: La URL de la web donde la vas a utilizar. Callback URL: Después de la autorazación, se llamará a esta URL con el oauth_token
  • Cambia los permisos de la app de Read and Write a Read, Write and Access Direct Messages. Para cambiar los permisos de la app, debes añadir un número de teléfono.
  • Ahora lo suyo es testear la OAuthentication, así que haz clic en Test Oauth y loguéate con tu cuenta de Twitter. Si todo ha salido correctamente, serás redirigido a la URL que has indicado en el formulario anterior. En dicha página, también podrás obtener la Consumer Key y la Consumer Secret. Cópialas.

Antes de empezar la integración del login de Twitter en tu proyecto, echa un vistazo a la estructura de carpetas y ficheros que utilizaremos en el proyecto.

application
> config
>> autoload.php
> controllers
>> User_authentication.php
> libraries
>> twitter-oauth-php
>>> OAuth.php
>>> twitteroauth.php
> models
>> User.php
> views
>> .htaccess
assets
> images
>> sign-in-with-twitter.png

Creación de la base de datos

Para almacenar los datos de los usuarios necesitaremos crear una tabla en la base de datos. El siguiente SQL crea la tabla users, la cual cuenta con ciertos campos obligatorios.

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `oauth_provider` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `oauth_uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `first_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `last_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `locale` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
 `picture_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `profile_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Controladores (User_authentication.php)

El controlador User_authentication contiene 3 funciones __construct(), index() y logout().

  • __construct() carga el modelo User para insertar o actualizar los datos del usuario en la base de datos
  • index() conecta con la API de Twitter, pasa la información del usuario al modelo User, carga el enlace de login o la vista del usuario y pasa los datos del usuario a la vista.
  • logout() desconecta al usuario de su cuenta de Twitter

En la función index(), se indica la Consumer Key ($consumerKey) y la Consumer Secret ($consumerSecret) de tu app de Twitter. No olvides actualizar la Callback URL de tu app de Twitter basándote en el valor de la variable $oauthCallback.

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class User_Authentication extends CI_Controller
{
    function __construct() {
        parent::__construct();
        //Load user model
        $this->load->model('user');
    }
    
    public function index(){
        $userData = array();
        
        //Include the twitter oauth php libraries
        include_once APPPATH."libraries/twitter-oauth-php-codexworld/twitteroauth.php";
        
        //Twitter API Configuration
        $consumerKey = 'Insert_Twitter_API_Key';
        $consumerSecret = 'Insert_Twitter_API_Secret';
        $oauthCallback = base_url().'user_authentication/';
        
        //Get existing token and token secret from session
        $sessToken = $this->session->userdata('token');
        $sessTokenSecret = $this->session->userdata('token_secret');
        
        //Get status and user info from session
        $sessStatus = $this->session->userdata('status');
        $sessUserData = $this->session->userdata('userData');
        
        if(isset($sessStatus) && $sessStatus == 'verified'){
            //Connect and get latest tweets
            $connection = new TwitterOAuth($consumerKey, $consumerSecret, $sessUserData['accessToken']['oauth_token'], $sessUserData['accessToken']['oauth_token_secret']); 
            $data['tweets'] = $connection->get('statuses/user_timeline', array('screen_name' => $sessUserData['username'], 'count' => 5));

            //User info from session
            $userData = $sessUserData;
        }elseif(isset($_REQUEST['oauth_token']) && $sessToken == $_REQUEST['oauth_token']){
            //Successful response returns oauth_token, oauth_token_secret, user_id, and screen_name
            $connection = new TwitterOAuth($consumerKey, $consumerSecret, $sessToken, $sessTokenSecret);
            $accessToken = $connection->getAccessToken($_REQUEST['oauth_verifier']);
            if($connection->http_code == '200'){
                //Get user profile info
                $userInfo = $connection->get('account/verify_credentials');

                //Preparing data for database insertion
                $name = explode(" ",$userInfo->name);
                $first_name = isset($name[0])?$name[0]:'';
                $last_name = isset($name[1])?$name[1]:'';
                $userData = array(
                    'oauth_provider' => 'twitter',
                    'oauth_uid' => $userInfo->id,
                    'username' => $userInfo->screen_name,
                    'first_name' => $first_name,
                    'last_name' => $last_name,
                    'locale' => $userInfo->lang,
                    'profile_url' => 'https://twitter.com/'.$userInfo->screen_name,
                    'picture_url' => $userInfo->profile_image_url
                );
                
                //Insert or update user data
                $userID = $this->user->checkUser($userData);
                
                //Store status and user profile info into session
                $userData['accessToken'] = $accessToken;
                $this->session->set_userdata('status','verified');
                $this->session->set_userdata('userData',$userData);
                
                //Get latest tweets
                $data['tweets'] = $connection->get('statuses/user_timeline', array('screen_name' => $userInfo->screen_name, 'count' => 5));
            }else{
                $data['error_msg'] = 'Some problem occurred, please try again later!';
            }
        }else{
            //unset token and token secret from session
            $this->session->unset_userdata('token');
            $this->session->unset_userdata('token_secret');
            
            //Fresh authentication
            $connection = new TwitterOAuth($consumerKey, $consumerSecret);
            $requestToken = $connection->getRequestToken($oauthCallback);
            
            //Received token info from twitter
            $this->session->set_userdata('token',$requestToken['oauth_token']);
            $this->session->set_userdata('token_secret',$requestToken['oauth_token_secret']);
            
            //Any value other than 200 is failure, so continue only if http code is 200
            if($connection->http_code == '200'){
                //Get twitter oauth url
                $twitterUrl = $connection->getAuthorizeURL($requestToken['oauth_token']);
                $data['oauthURL'] = $twitterUrl;
            }else{
                $data['oauthURL'] = base_url().'user_authentication';
                $data['error_msg'] = 'Error connecting to twitter! try again later!';
            }
        }

        $data['userData'] = $userData;
        $this->load->view('user_authentication/index',$data);
    }

    public function logout() {
        $this->session->unset_userdata('token');
        $this->session->unset_userdata('token_secret');
        $this->session->unset_userdata('status');
        $this->session->unset_userdata('userData');
        $this->session->sess_destroy();
        redirect('/user_authentication');
    }
}

Modelos (User.php)

El modelo User contiene solamente una función llamada checkuser(), que se utiliza para insertar o actualizar loa datos del usuario en la tabla users.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class User extends CI_Model{
    function __construct() {
        $this->tableName = 'users';
        $this->primaryKey = 'id';
    }
    public function checkUser($data = array()){
        $this->db->select($this->primaryKey);
        $this->db->from($this->tableName);
        $this->db->where(array('oauth_provider'=>$data['oauth_provider'],'oauth_uid'=>$data['oauth_uid']));
        $prevQuery = $this->db->get();
        $prevCheck = $prevQuery->num_rows();
        
        if($prevCheck > 0){
            $prevResult = $prevQuery->row_array();
            $data['modified'] = date("Y-m-d H:i:s");
            $update = $this->db->update($this->tableName,$data,array('id'=>$prevResult['id']));
            $userID = $prevResult['id'];
        }else{
            $data['created'] = date("Y-m-d H:i:s");
            $data['modified'] = date("Y-m-d H:i:s");
            $insert = $this->db->insert($this->tableName,$data);
            $userID = $this->db->insert_id();
        }

        return $userID?$userID:FALSE;
    }
}

Vistas (user_authentication/index.php)

Inicialmente, el botón para hacer login con Twitter se muestra al usuario. Una vez se ha hecho login satisfactoriamente, se mostrará la información del usuario y sus últimos tweets.

<?php
if(!empty($error_msg)){
    echo '<p class="error">'.$error_msg.'</p>';    
}
?>

<?php
if(!empty($userData)){
    $outputHTML = '
        <div class="wrapper">
            <h1>Twitter Profile Details </h1>
            <div class="welcome_txt">Welcome <b>'.$userData['first_name'].'</b></div>
            <div class="tw_box">
                <p class="image"><img src="'.$userData['picture_url'].'" alt="" width="300" height="220"/></p>
                <p><b>Twitter Username : </b>'.$userData['username'].'</p>
                <p><b>Name : </b>'.$userData['first_name'].' '.$userData['last_name'].'</p>
                <p><b>Locale : </b>' . $userData['locale'].'</p>
                <p><b>Twitter Profile Link : </b><a href="'.$userData['profile_url'].'" target="_blank">'.$userData['profile_url'].'</a></p>
                <p><b>You are login with : </b>Twitter</p>
                <p><b>Logout from <a href="'.base_url().'user_authentication/logout">Twitter</a></b></p>';
    //Latest tweets
    if(!empty($tweets)){
        $outputHTML .= '<div class="tweetList"><strong>Latest Tweets : </strong>
            <ul>';
        foreach($tweets  as $tweet){
            $outputHTML .= '<li>'.$tweet->text.' <br />-<i>'.$tweet->created_at.'</i></li>';
        }
        $outputHTML .= '</ul></div>';
    }
    $outputHTML .= '</div>
        </div>';
}else{
    $outputHTML = '<a href="'.$oauthURL.'"><img src="'.base_url().'assets/images/sign-in-with-twitter.png" alt=""/></a>';
}
?>
<?php echo $outputHTML; ?>

Fuente: codexworld.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP