Login con LinkedIn en CodeIgniter

Integrar la función de Iniciar sesión con LinkedIn hace que tu sistema de login sea mucho más completo. Te proporciona un forma sencilla y rápida de iniciar sesión en tu aplicación web sin tener que llegar a registrarte manualmente. Utilizando el login de LinkedIn, los usuarios pueden iniciar sesión en tu sitio web utilizando su perfil en Linkedin, sin tener que registrarse.

Antes de integrar el login con LinkedIn en CodeIgniter utilizando la librería OAuth Client, debes crear una aplicación de Linkedin. Hace unos días te explicamos cómo hacerlo en el artículo: Cómo crear una app de LinkedIn y obtener el Client ID y el Client Secret. También es importante que guardes el Client ID y el Client Secret tras crear la app, ya que estos datos los necesitaremos más adelante.

Una vez dicho esto, vamos a ver cómo integrar el login con LinkedIn en CodeIgniter.

Esta sería la estructura de ficheros:

codeigniter
> aplication
>> config
>>> autoload.php
>>> linkedin.php
>> controllers
>>> User_authentication.php
>> libraries
>>> linkedin-oauth-client
>> models
>>> User.php
>> views
>>> user_authentication
>>>> index.php
> assets
>> css
>> images

Creación de la base de datos

Necesitamos crear una tabla dentro de la base de datos para almacenar la información del perfil de LinkedIn. Para ello añadiremos la tabla users en nuestra base de datos MySQL.

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,
 `first_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `last_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `gender` varchar(10) 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;

Config

autoload.php

La base de datos y las librerías de sesiones son necesarias en todo el proceso del login. Será una buena idea definir estas librerías en el archivo autoload.php.

$autoload['libraries'] = array('session','database');

linkedin.php

En este fichero tendremos que especificar la variables que nos ha proporcionado LinkedIn, es decir: el Client ID, el Client Secret y la URL de redireccionamiento.

<?php defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
|  LinkedIn API Configuration
| -------------------------------------------------------------------
|
| To get an facebook app details you have to create a Facebook app
| at Facebook developers panel (https://developers.facebook.com)
|
|  linkedin_api_key        string   Your LinkedIn App Client ID.
|  linkedin_api_secret     string   Your LinkedIn App Client Secret.
|  linkedin_redirect_url   string   URL to redirect back to after login. (do not include base URL)
|  linkedin_scope          array    Your required permissions.
*/
$config['linkedin_api_key']       = 'InsertAppClientId';
$config['linkedin_api_secret']    = 'InsertAppClientSecret';
$config['linkedin_redirect_url']  = 'user_authentication/';
$config['linkedin_scope']         = 'r_basicprofile r_emailaddress';

Controllers (User_authentication.php)

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class User_Authentication extends CI_Controller
{
    function __construct() {
        parent::__construct();
        
        // Load linkedin config
        $this->load->config('linkedin');
        
        //Load user model
        $this->load->model('user');
    }
    
    public function index(){
        $userData = array();
        
        //Include the linkedin api php libraries
        include_once APPPATH."libraries/linkedin-oauth-client/http.php";
        include_once APPPATH."libraries/linkedin-oauth-client/oauth_client.php";
        
        
        //Get status and user info from session
        $oauthStatus = $this->session->userdata('oauth_status');
        $sessUserData = $this->session->userdata('userData');
        
        if(isset($oauthStatus) && $oauthStatus == 'verified'){
            //User info from session
            $userData = $sessUserData;
        }elseif((isset($_REQUEST["oauth_init"]) && $_REQUEST["oauth_init"] == 1) || (isset($_REQUEST['oauth_token']) && isset($_REQUEST['oauth_verifier']))){
            $client = new oauth_client_class;
            $client->client_id = $this->config->item('linkedin_api_key');
            $client->client_secret = $this->config->item('linkedin_api_secret');
            $client->redirect_uri = base_url().$this->config->item('linkedin_redirect_url');
            $client->scope = $this->config->item('linkedin_scope');
            $client->debug = false;
            $client->debug_http = true;
            $application_line = __LINE__;
            
            //If authentication returns success
            if($success = $client->Initialize()){
                if(($success = $client->Process())){
                    if(strlen($client->authorization_error)){
                        $client->error = $client->authorization_error;
                        $success = false;
                    }elseif(strlen($client->access_token)){
                        $success = $client->CallAPI('http://api.linkedin.com/v1/people/~:(id,email-address,first-name,last-name,location,picture-url,public-profile-url,formatted-name)', 
                        'GET',
                        array('format'=>'json'),
                        array('FailOnAccessError'=>true), $userInfo);
                    }
                }
                $success = $client->Finalize($success);
            }
            
            if($client->exit) exit;
    
            if($success){
                //Preparing data for database insertion
                $first_name = !empty($userInfo->firstName)?$userInfo->firstName:'';
                $last_name = !empty($userInfo->lastName)?$userInfo->lastName:'';
                $userData = array(
                    'oauth_provider'=> 'linkedin',
                    'oauth_uid'     => $userInfo->id,
                    'first_name'     => $first_name,
                    'last_name'     => $last_name,
                    'email'         => $userInfo->emailAddress,
                    'locale'         => $userInfo->location->name,
                    'profile_url'     => $userInfo->publicProfileUrl,
                    'picture_url'     => $userInfo->pictureUrl
                );
                
                //Insert or update user data
                $userID = $this->user->checkUser($userData);
                
                //Store status and user profile info into session
                $this->session->set_userdata('oauth_status','verified');
                $this->session->set_userdata('userData',$userData);
                
                //Redirect the user back to the same page
                redirect('/user_authentication');

            }else{
                 $data['error_msg'] = 'Some problem occurred, please try again later!';
            }
        }elseif(isset($_REQUEST["oauth_problem"]) && $_REQUEST["oauth_problem"] <> ""){
            $data['error_msg'] = $_GET["oauth_problem"];
        }else{
            $data['oauthURL'] = base_url().$this->config->item('linkedin_redirect_url').'?oauth_init=1';
        }
        
        $data['userData'] = $userData;
        
        // Load login & profile view
        $this->load->view('user_authentication/index',$data);
    }

    public function logout() {
        //Unset token and user data from session
        $this->session->unset_userdata('oauth_status');
        $this->session->unset_userdata('userData');
        
        //Destroy entire session
        $this->session->sess_destroy();
        
        // Redirect to login page
        redirect('/user_authentication');
    }
}

Libraries

Utilizaremos la librería OAuth Client para conectarnos con la API de LinkedIn e integrar el login con LinkedIn. Por ello, el directorio linkedin-oauth-client contendrá la librerías necesarias para la autenticación.

Models (User.php)

Utilizaremos el método checkUser() para insertar o actuallizar la información del perfil en nuestra base de datos.

<?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;
    }
}

Views (user_authentication/index.php)

Si ya está logueado con su cuenta de LinkedIn, se mostrará la información del perfil. En caso contrario, se mostrará el botón de hacer login con LinkedIn.

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

if(!empty($userData)){ ?>
    <div class="login-form">
        <div class="head">
            <img src="<?php echo $userData['picture_url']; ?>" alt=""/>
        </div>
        <div class="content">
        <li>
            <p><?php echo $userData['first_name'].' '.$userData['last_name']; ?></p>
        </li>
        <li>
            <p><?php echo $userData['email']; ?></p>
        </li>
        <li>
            <p><?php echo $userData['locale']; ?></p>
        </li>
        <div class="foot">
            <a href="<?php echo base_url().'user_authentication/logout'; ?>">Logout</a>
            <a href="<?php echo $userData['profile_url']; ?>" target="_blank">View Profile</a>
            <div class="clear"> </div>
        </div>
        </div>
    </div>
<?php
}else{
    echo '<div class="linkedin_btn"><a href="'.$oauthURL.'"><img src="'.base_url().'assets/images/sign-in-with-linkedin.png" /></a></div>';
}
?>

Fuente: codexworld.com

COMPARTE ESTE ARTÍCULO

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