[PHP] Login with Linkedin (Classic API)


Salve a tutti,

oggi spiegherò come prelevare le informazioni di un ‘utente che effettua il login sul nostro portale/sito mediante linkedin.

Lo script è interamente scritto in PHP ed è completamente commentato per comprenderne il funzionamento.
NB: lo script in PHP di esempio sul portale developer di linkedin non funziona correttamente, questo è adattato da me per il corretto funzionamento.

Detto questo proseguiamo per step alla configurazione dello script e dell’app linkedin da utilizzare poi:

Step 1: Creazione dell’app Linkedin mediante iscrizione al portale developer:
Collegatevi a questo indirizzo: https://www.linkedin.com/secure/developer

Vi apparirà una cosa del genere:

passo_1_linkedin

Dopo esservi loggati vi apparirà una lista (probabilmente vuota) dove partiremo con la creazione della nostra app. Clicchiamo sul link “Aggiungi una nuova applicazione” e successivamente vi apparirà una schermata del genere:

esempio confing app sviluppo

Ora in questa pagina (foto sopra) dovrete compilarla, alcuni campi sono chiari e precisi mentre su alcuni dovrei dire due parole:

  1. Nella sezione Contratto utente OAuth -> Ambito predefinito dovrete selezionare i permessi che la vostra applicazione dovrà o potrà richiedere. I nomi sono molto comprensibili.
  2. Nella sezione Contratto utente OAuth -> URL reindirizzamento OAuth 2.0 in questo box dovrete inserire gli URL/Link completi della posizione del vostro script o di qualunque redirect URL che andrete ad utilizzare nello script.
  3. Nella sezione Informazioni sull’applicazione -> questa selezione sè selezionerete Developement vorrà dire che il vostro login sarà funzionante solo agli amministratori o agli sviluppatori dichiarati in precedenza nell’app….altre persone che proveranno a loggarsi … il login non funzionerà, mentre l’esatto contrario se selezionerete Live

Detto questo alla fine confermate la procedura e troverete dei dati di questo tipo:

dati_finali_app

In questa schermata finale troverete 2 chiavi importantissime che serviranno a far funzionare correttamente il nostro script, sarebbero Chiave API e Chiave privata da conservare e mettere da parte.

Per ora abbiamo completato la parte di configurazione della nostra applicazione linkedin, ora passiamo al nostro script PHP:

 $_SESSION['expires_at'])) {
        // Controllo se il token è scaduto
        $_SESSION = array();
    }
    if (empty($_SESSION['access_token'])) {
        // se invece tutto è andato bene allora prelevo  e genero il codice di autorizzazione finale
        getAuthorizationCode();
    }
}
 
// bene ora se tutto è andato bene prelevo le informazioni dell'utente

try {

	//prelevo l'oggetto contenente i dati del profilo loggato
	$user = fetch('GET', '/v1/people/~:(id,first-name,last-name,headline,picture-url,email-address,public-profile-url,skills,location:(name))');
	
	//prelevo le connection dell'utente
	$connections = fetch('GET', '/v1/people/~/connections:(id,first_name,last-name,headline,picture-url)');
	//print_r($connections);

	//prelevo i gruppi alle quali l'utente loggatto è iscritto
	$groups = fetch('GET', '/v1/people/~/suggestions/groups:(id,name)');
    

	print_r($user);

	print_r($connections);
	
	print_r($groups);
    
	/*########################### FINE UTENTE EX_NOVO ###############################*/
	//se qualche cosa va male (capita) allora un errore a video
	if($user == FALSE || $connections == FALSE || $groups == FALSE) {
	
		throw new Exception("MAINTENANCE SERVER. Sorry Try Later.");
		
	}
	
}catch (Exception $e) {
    //se qualunque cosa va n errore allora catturo l'errore e cancello la sessione attiva per poter riprovare in un secondo momento
	session_unset(); 	
	session_destroy(); 
	die($e->getMessage());
}
 /*
    Funziona per il prelievo del codice di autorizzazione
 */
function getAuthorizationCode() {
    //parametri da inviare compresi gli scope(permessi richiesti) le chiavi e uno state anti CSRF
    $params = array('response_type' => 'code',
                    'client_id' => API_KEY,
                    'scope' => SCOPE,
                    'state' => uniqid('', true), // unique long string
                    'redirect_uri' => REDIRECT_URI,
              );
 
    // Authentication request
    $url = 'https://www.linkedin.com/uas/oauth2/authorization?' . http_build_query($params);
     
    // L'anti CSRF viene salvato in sessione
    $_SESSION['state'] = $params['state'];
 
    // finto ciò si parte con la richiesta a linkedin
    @header("Location: $url");
    exit;
}
     
/*
    funzione per la richiesta di un token di accesso
*/
function getAccessToken() {

    //soliti parametri in più il codice che è tornato fuori dalla funzione getAuthorizationCode()
    $params = array('grant_type' => 'authorization_code',
                    'client_id' => API_KEY,
                    'client_secret' => API_SECRET,
                    'code' => $_GET['code'],
                    'redirect_uri' => REDIRECT_URI,
              );
     
    // ilink per la richiesta del token
    $url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params);
     
    // preparo il pacchetto header con alcuni parametri standard
    $context = stream_context_create(
                    array('http' =>
                        array('method' => 'POST',
                        )
                    )
                );
	
	// new implementation cURL of Linkedin Login
	// By Luongo Vincenzo
	/*
	function curl($url){
		$ch = curl_init();  
		$timeout = 30;  
		curl_setopt($ch, CURLOPT_URL, $url);  
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
		$result = curl_exec($ch);  
		curl_close($ch);  
	}
	
	$response = curl($url);
	*/
	
	//FIX warning By Luongo Vincenzo
    //cerco di prelevare le informazioni
    $response = @file_get_contents($url, false, $context);
 
    // le informazioni prelevate sono encodate in json così le decodifico
    $token = json_decode($response);
 
    // salvo in sessione sia il token e sia la sua durata
    $_SESSION['access_token'] = $token->access_token; // guard this!
    $_SESSION['expires_in']   = $token->expires_in; // relative time (in seconds)
    $_SESSION['expires_at']   = time() + $_SESSION['expires_in']; // absolute time
     
    return true;
}
 
/*
    la funzione fetch non è altro che la preparazione del parametro resource 
    e la costruzione della chiamata per la richiesta dei dati
*/
function fetch($method, $resource, $body = '') {
    //preparo i parametri per l'invio (in questo caso il token di accesso e la tipologia di formato 
    //dei dati che si volgiono far ritornare
    $params = array('oauth2_access_token' => $_SESSION['access_token'],
                    'format' => 'json',
              );
     
    // dinuovo il link di invio dei dati ma questa volta sotto HTTPS (sempre)
    $url = 'https://api.linkedin.com' . $resource . '?' . http_build_query($params);

    
    //qui si setta il parametro di invio dati GET, POST, ecc... dipende dal parametro della funzione method che si decide
    $context = stream_context_create(
                    array('http' =>
                        array('method' => $method,
                        )
                    )
                );
 
 
    // prelevo le informazioni
    $response = @file_get_contents($url, false, $context);
	
	// FIX By Luongo Vincenzo 
	if($response == FALSE) {
	
		throw new Exception("MAINTENANCE SERVER. Sorry Try Later.");
		return FALSE;
	}else{
 
        //ritorno l'oggetto json con i dati richiesti
		return json_decode($response);
	}
}

?>

Ecco il nostro script, per farlo funzionare dovrete sostituire con le vostre chiavi le prime righe.
Il codice è interamente commentato e non dovreste avere difficoltà nel comprenderlo ma per qualsiasi problema non esitate a commentare.

PS: Questo script comprende i permessi per il profilo completo, le connection e i gruppi iscritti per altri permessi e richieste potete recarvi sulla documentazione linkedin a questo indirizzo:
https://developer.linkedin.com/documents/profile-api

Se volete vedere lo script in esecuzione funzionante potrete testarlo/provarlo al seguente indirizzo:

http://www.luongovincenzo.it/getLinkedinInfo.php



VI RICORDO CHE È TUTTO A SCOPO ILLUSTRATIVO.

NON MI ASSUMO NESSUNA RESPONSABILITÀ NELL’ USO CHE NE FARETE.

IO E I MIEI TUTORIAL NON NE SIAMO RESPONSABILI.

UTILIZZARE SOFTWARE CONTRAFFATTO E' UN REATO.

Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale.

Ti è piaciuto il mio articolo? Ti piacerebbe offrirmi un caffè? Con PayPal è facile


Vincenzo

Vincenzo

Full Stack Web && Mobile Developer Un piccolo blog che ho reso libero come diario personale, se serve a me, potrebbe servire ad altri.

1
Lascia una recensione

avatar

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

  Subscribe  
Notificami
BellPowers
Ospite
BellPowers

Excellent weblog right here! Also your site lots up fast! What host are you the usage of? Can I am getting your affiliate link in your host? I want my website loaded up as quickly as yours lol