Sommaire:

diagram-oauth-handshake

Vous voulez accéder a l’API de LinkedIn en mettant en œuvre le protocole d’authentification Oauth?

Voici un Screencast suivi d’un tutorial vous expliquant comment creer un application accedant a l’API de LinkedIn.


Le ScreenCast

http://blip.tv/file/get/Formatix-linkedInAPIZendOAuthfr986.mp4

Le Tutorial Ecrit

Etape 0. Obtention des Clefs Abonné LinkedIn

  • Allez a l’adresse suivante https://www.linkedin.com/secure/developer
  • Cliquez sur Ajouter une nouvelle Application
  • Remplir le formulaire
  • Voila! Vous avez maintenant 2 Clefs pour permettre a votre application d’initier une authentification auprès de LinkedIn

Etape 1. Obtenir les librairies Zend

Obtenir le Librairie Zend Standard

svn checkout http://framework.zend.com/svn/framework/standard/trunk/library/

Obtenir le Librairie Zend de L’Incubateur

svn checkout http://framework.zend.com/svn/framework/standard/incubator/library/

Si vous etes sous Windows vous pouvez telecharger Tortoise SVN afin d’utiliser SVN pour extraire les sources Zend.

Etape 2.a Inclure le Module Zend_Oauth

Dans un premier temps on doit ajouter les chemins de la Librairie Zend et de L’Incubateur a l’Include Path:

set_include_path( '/home/mywebspace/libray/' . PATH_SEPARATOR .  '/home/mywebspace/incubator/libray/' . PATH_SEPARATOR . get_include_path()                                       );

Bien évidement vous remplacerez /home/mywebspace/libray/ and /home/mywebspace/incubator/libray/ par vos propres chemins.

Si vous êtes sur Windows ces chemins ressembleront plutôt a ceci: C:/mylibrariesfolder/library’

Dans un second temps on inclut la définition de la classe Zend_Oauth qui nous intéresse, a savoir Zend_Oauth_Consumer

require_once('Zend/Oauth/Consumer.php');

Etape 2.b Corriger le Module Zend_Oauth

Au moment ou j’écris ce tutoriel il y a un petit problème dans Zend_Oauth qui empêche de se connecter a LinkedIn via le protocole Oauth 0.1 Rev A

Pour régler ce problème:

  • Ouvrez./Zend/Oauth/Http/UserAuthorisation.php file
  • Trouvez la fonction assembleParams
  • Effacez ou commentez les lignes suivantes
public function assembleParams()
{
	$params = array();
	$params['oauth_token'] = $this->_consumer->getLastRequestToken()->getToken();
	$callback = $this->_consumer->getCallbackUrl(); // callback correct? Not user auth uri?

	// if (!empty($callback)) {
	// $params['oauth_callback'] = $callback;
	// }
	if (!empty($this->_parameters)) {
		$params = array_merge($params, $this->_parameters);
	}
	return $params;
}

Etape 3. Création d’une instance de Zend_Oauth_Consumer

Vous devrez enrichir $options avec vos propre localUrl, callbackUrl, et saisir les clefs que vous avez récupéré a l’Etape 0.

$options = array(
'version' => '1.0',
'localUrl' => 'http://localhost/Projets/API/oauth.php',
'callbackUrl' => 'http://localhost/Projets/API/oauth.php',
'requestTokenUrl' => 'https://api.linkedin.com/uas/oauth/requestToken',
'userAuthorisationUrl' => 'https://api.linkedin.com/uas/oauth/authorize',
'accessTokenUrl' => 'https://api.linkedin.com/uas/oauth/accessToken',
'consumerKey' => 'YOUR_CONSUMER_KEY',
'consumerSecret' => 'YOUR_SECRET_KEY'
);

$consumer = new Zend_Oauth_Consumer( $options );

Etape 4. Effectuer le handshake d’Authentification Oauth

// Démarrer la gestion des Sessions afin de Stocker le Request Token et l'Acess Token
session_start ();

if ( !isset ( $_SESSION ['ACCESS_TOKEN'] )) {
	// On a pas d'Access Token
	if (! empty ( $_GET )) {
		// Mais il y a des paramètres passés via l'URL

		// Obtenir l'Access Token
		$token = $consumer->getAccessToken ( $_GET, unserialize ( $_SESSION ['REQUEST_TOKEN'] ) );

		// Stocker l'Access Token
		$_SESSION ['ACCESS_TOKEN'] = serialize ( $token );
	} else {
		// On a rien du tout

		// Commençons par demander un Request Token
		$token = $consumer->getRequestToken ();

		// Stocker le Request Token
		$_SESSION ['REQUEST_TOKEN'] = serialize ( $token );

		// Rediriger l'Utilisateur Vers la page d'Authentification de LinkedIn
		$consumer->redirect ();
	}
} else {
	// On a Deja un Access Token

	// Récupération de l'Access Token
	$token = unserialize ( $_SESSION ['ACCESS_TOKEN'] );

}

Step 5. Récupération du profil LinkedIn de l’Utilisateur

Maintenant que l’Authentification est terminee on peut demander a LinkedIn des données associées au compte utilisateur

// Utilisation du Client HTTP gérant intrinsèquement l'OAuth
$client = $token->getHttpClient($options);

// Fixer l'URI LinkedIn souhaitée
$client->setUri('https://api.linkedin.com/v1/people/~');
// Fixer la Methode d'Accès (GET, POST or PUT)
$client->setMethod(Zend_Http_Client::GET);
// Exécution de la requête et obtention du resultat
$response = $client->request();

// Obtention d'un contenu au format XML contenant le profil utilisateur
$content =  $response->getBody();

Le contenu XML ressemble a ceci

LinkedIn-API-Screencast-Get-Profile-XML

Step 6. Extraction et Affichage des données contenues dans le XML renvoyé par LinkedIn

// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP

$xml = simplexml_load_string($content);

// Affichage
echo 'First Name: ' . $xml->{'first-name'};
echo '<br/>';
echo 'Last Name: ' . $xml->{'last-name'};
echo '<br/>';
echo 'Headline: ' . $xml->{'headline'};

Le Structure de l’Objet SimpleXML ressemble a ceci

Php-LinkedIn-API-Screencast-Simple-XML-Profile-Structure

Step 7. Le Script PHP dans son ensemble

Vous pouvez creer un fichier oauth.php et copier le code qui suit dedans, en mettant a jour les chemins et les clefs abonné.

<?php

set_include_path( 'C:/Users/Formatix.Eu/Desktop/MesProjets/API/library' . PATH_SEPARATOR .  'C:/Users/Formatix.Eu/Desktop/MesProjets/API/incubator/library' . PATH_SEPARATOR . get_include_path()                                       );

require_once('Zend/Oauth/Consumer.php');

$options = array(
'version' => '1.0',
'localUrl' => 'http://localhost/Projets/API/oauth.php',
'callbackUrl' => 'http://localhost/Projets/API/oauth.php',
'requestTokenUrl' => 'https://api.linkedin.com/uas/oauth/requestToken',
'userAuthorisationUrl' => 'https://api.linkedin.com/uas/oauth/authorize',
'accessTokenUrl' => 'https://api.linkedin.com/uas/oauth/accessToken',
'consumerKey' => 'YOUR_CONSUMER_KEY',
'consumerSecret' => 'YOUR_CONSUMER_SECRET_KEY'
);

$consumer = new Zend_Oauth_Consumer( $options );

//Démarrer la gestion des Sessions afin de Stocker le Request Token et l'Acess Token
session_start();

if ( !isset ( $_SESSION ['ACCESS_TOKEN'] )) {
	// On a pas encore d'Access Token
	if (! empty ( $_GET )) {
		// Mais il y a des paramètres passés via l'URL

		// Obtenir l'Access Token
		$token = $consumer->getAccessToken ( $_GET, unserialize ( $_SESSION ['REQUEST_TOKEN'] ) );

		// Stocker l'Access Token
		$_SESSION ['ACCESS_TOKEN'] = serialize ( $token );
	} else {
		// On a rien du tout

		// Commençons par demander un Request Token
		$token = $consumer->getRequestToken ();

		// Stocker le Request Token
		$_SESSION ['REQUEST_TOKEN'] = serialize ( $token );

		// Rediriger l'Utilisateur Vers la page d'Authentification de LinkedIn
		$consumer->redirect ();
	}
} else {
	// On a Deja un Access Token

	// Récupération de l'Access Token
	$token = unserialize ( $_SESSION ['ACCESS_TOKEN'] );

}

// Utilisation du Client HTTP gérant intrinsèquement l'OAuth
$client = $token->getHttpClient($options);

// Fixer l'URI LinkedIn souhaitée
$client->setUri('https://api.linkedin.com/v1/people/~');
// Fixer la Methode d'Accès (GET, POST or PUT)
$client->setMethod(Zend_Http_Client::GET);
// Exécution de la requête et obtention du resultat
$response = $client->request();

// Obtention d'un contenu au format XML contenant le profil utilisateur
$content =  $response->getBody();

// De-commentez les lignes qui suivent pour visualiser le code XML
// header('Content-Type: ' . $response->getHeader('Content-Type'));
// echo $content;
// exit;

// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP
$xml = simplexml_load_string($content);

// De-commentez les lignes qui suivent pour visualiser la structure de l'objet Simple XML
// echo '<pre>';
// print_r($xml);
// echo'</pre>';

//  Affichage du Profil Utilisateur comme bon vous semble
echo 'First Name: ' . $xml->{'first-name'};
echo '<br/>';
echo 'Last Name: ' . $xml->{'last-name'};
echo '<br/>';
echo 'Headline: ' . $xml->{'headline'};

?>

Step 8. Transformer le code “Brut” en une jolie Classe PHP

<?php

/*
*
* @abstract: Cette Classe sert a accéder a l'API de LinkedIn en utilisant l'Authentification Oauth Authentication Protocol
* @author: Christophe Fiat
* @version: 0.1 2009-11-30
* @copyright: FormatiX.EU
*
*/

class linkedIn
{

	private $options;
	private $consumer;
	private $client;
	private $token;

	public function __construct($params)
	{
		set_include_path( 'C:/Users/Formatix.Eu/Desktop/MesProjets/API/library' . PATH_SEPARATOR .  'C:/Users/Formatix.Eu/Desktop/MesProjets/API/incubator/library' . PATH_SEPARATOR . get_include_path()                                       );

		require_once('Zend/Oauth/Consumer.php');

		$this->options = array(
		'version' => '1.0',
		'localUrl' => 'http://localhost/Projets/API/oauth.php',
		'callbackUrl' => 'http://localhost/Projets/API/oauth.php',
		'requestTokenUrl' => 'https://api.linkedin.com/uas/oauth/requestToken',
		'userAuthorisationUrl' => 'https://api.linkedin.com/uas/oauth/authorize',
		'accessTokenUrl' => 'https://api.linkedin.com/uas/oauth/accessToken',
		'consumerKey' => $params['consumerKey'],
		'consumerSecret' => $params['consumerSecret']
		);

		$this->consumer = new Zend_Oauth_Consumer( $this->options );

	}

	public function connect()
	{
		// Démarrer la gestion des Sessions afin de Stocker le Request Token et l'Acess Token
		session_start ();

		if ( !isset ( $_SESSION ['ACCESS_TOKEN'] )) {
			// On a pas d'Access Token
			if (! empty ( $_GET )) {
				// Mais il y a des paramètres passés via l'URL

				// Obtenir l'Access Token
				$this->token = $this->consumer->getAccessToken ( $_GET, unserialize ( $_SESSION ['REQUEST_TOKEN'] ) );

				// Stocker l'Access Token
				$_SESSION ['ACCESS_TOKEN'] = serialize ( $this->token );
			} else {
				// On a rien du tout

				// Commençons par demander un Request Token
				$this->token = $this->consumer->getRequestToken ();

				// Stocker le Request Token
				$_SESSION ['REQUEST_TOKEN'] = serialize ( $this->token );

				// Rediriger l'Utilisateur Vers la page d'Authentification de LinkedIn
				$this->consumer->redirect ();
			}
		} else {
			// On a Deja un Access Token

			// Récupération de l'Access Token
			$this->token = unserialize ( $_SESSION ['ACCESS_TOKEN'] );

		}

		// Utilisation du Client HTTP gérant intrinsèquement l'OAuth
		$this->client = $this->token->getHttpClient($this->options);

	}

	public function whoAmI()
	{

		// Fixer l'URI LinkedIn souhaitée
		$this->client->setUri('https://api.linkedin.com/v1/people/~');
		// Fixer la Methode d'Accès (GET, POST or PUT)
		$this->client->setMethod(Zend_Http_Client::GET);
		// Exécution de la requête et obtention du resultat
		$response = $this->client->request();

		// Obtention d'un contenu au format XML contenant le profile utilisateur
		$content =  $response->getBody();

		// De-commentez les lignes qui suivent pour visualiser le code XML
		// header('Content-Type: ' . $response->getHeader('Content-Type'));
		// echo $content;
		// exit;

		// Utilisation de SimpleXML pour transformer la chaine XML en Objet PHP
		$xml = simplexml_load_string($content);

		// De-commentez les lignes qui suivent pour visualiser la structure de l'objet Simple XML
		// echo '<pre>';
		// print_r($xml);
		// echo'</pre>';

		//  Affichage du Profil Utilisateur comme bon vous semble
		echo 'First Name: ' . $xml->{'first-name'};
		echo '<br/>';
		echo 'Last Name: ' . $xml->{'last-name'};
		echo '<br/>';
		echo 'Headline: ' . $xml->{'headline'};

	}

} // Class End

// Utilisation de Cette Classe

$params = Array(    'consumerKey' => 'YOUR_CONSUMER_KEY',
'consumerSecret' => 'YOUR_CONSUMER_SECRET_KEY'
);

$linkedin = new linkedIn($params);

$linkedin->connect();

$linkedin->whoAmI();

?>