Sommaire:
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
Le Tutorial Ecrit
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.
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');
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:
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;
}
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 );
// 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'] );
}
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

// 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

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'};
?>
<?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();
?>
4 Responses
Christophe
10|Jan|2010 1Bonjour,
j’aime beaucoup l’étape 5 de la récupération du profil de Gérard Bouchard, je vois que nous avons les mêmes références…
Je découvre votre site, et c’est pour l’instant plutôt complet.
Un abonné de plus à votre RSS.
Merci et bonne continuation.
Fred Blanc
24|Feb|2010 2Bonjour,
En utilisant le ZF 1.10.1, le script s’interrompt sur la ligne suivante :
// Rediriger l’Utilisateur Vers la page d’Authentification de LinkedIn
$this->consumer->redirect ();
Avec les messages d’erreurs suivants :
Uncaught exception ‘Zend_Uri_Exception’ with message ‘$uri is not a string’ in …
Avez vous une idée de ce qu’il faut mettre en place pour que cela fonctionne ? Ne manque t-il des paramètres dans la fonction redirect ?
Cordialement,
Chris
26|Feb|2010 3Hello Fred,
Quand Zend Oauth a intégré Zend 1.10 ils ont renommé ‘userAuthorisationUrl’ en ‘userAuthorizationUrl’.
J’imagine que ceci est a l’origine de ton erreur.
Tiens moi au courant.
Chris
Fred Blanc
27|Feb|2010 4Hello Chris,
Oui merci. En effet, j’avais pu le lire dans la partie anglaise du site. Merci en tout cas.
Bonne journée,
Cordialement,
Fred
Leave a reply