Consommer un service web oauth en PHP avec Zend_Oauth
Posted on | January 4, 2010 | No Comments
Oauth est un protocole créé en 2007. Il permet aux applications web, mobiles ou de bureaux, d’accéder à des services distants via des API, sans demander aux utilisateurs d’exposer leurs identifiant / mot de passe.
Oauth est largement utilisé par Google, Twitter ou encore LinkedIn pour ne citer qu’eux.
Auparavant, l’API twitter n’est disponible qu’en passant le twitterId et le mot de passe de l’utilisateur dans l’URL du service. Cela supposait donc que les applications utilisant l’API gardaient ces informations et pouvaient donc les utiliser à mauvais escient.
Dans ce billet, j’essaye d’expliquer comment consommer un service Oauth, avec un des composants PHP du Zend Framework.
Sans trop rentrer dans les détails, le schéma suivant explique simplement comment est implémenté ce protocole et comment l’authentification est délégué aux services garant de l’identité de leurs utilisateurs.

Comment consommer un service OAuth ?
- Première étape, demandez au service une clef de développement ou clef d’API. Il s’agit de 2 chaines de caractères, l’une publique, l’autre privée.
- Créer les requêtes à la main. Une URL ressemble alors à cela :
http://ma.gnolia.com/api/rest/2/bookmarks_count?auth_consumer_key=bfd525a7dsdsdsdsd47eff7ce497abe6156f2204b265fb2&oauth_nonce=1262624840937&oauth_signature_method=HMAC-SHA1&oauth_token=e3061b0c3f1815b5158bcd16935c998004b265fb2&oauth_version=1.0&oauth_timestamp=1262628440&oauth_signature=nK1jgAyfhz0NMOi6WHQW6O2Ks8w= Barbare me direz vous… Mais c’est possible. En plus, c’est du plus grand effet dans les dîners mondains. - …Ou utiliser une librairie permettant de générer les appels aux services OAuth. Il en existe dans à peu près tous les langages.
Exemple PHP avec Zend_Oauth
Pour le moment, ce composant est dans l’incubateur Zend, donc non disponible dans les versions de Zend Framwork 1.9.
J’espère qu’il le sera dans la 1.10. Les développeurs ont l’air assez réactif. Pour preuve, je leur ai relevé 2 bugs dans la compatibilité avec les version 1.a et avec les appels en PUT, et ils sont déjà en cours de résolution ou fixées.
En attendant, le code est récupérable dans le subversion Zend, à l’adresse suivante.
Et voilà l’exemple de code
<?php
session_start();
require_once 'Zend/Oauth/Consumer.php';
$options = array(
'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0',
'signatureMethod' => 'HMAC-SHA1',
'localUrl' => 'http://your/path/to/this/file.php',
'requestTokenUrl' => 'http://ma.gnolia.com/oauth/get_request_token',
'userAuthorisationUrl' => 'http://ma.gnolia.com/oauth/authorize',
'accessTokenUrl' => 'http://ma.gnolia.com/oauth/get_access_token',
'consumerKey' => 'YOUR_CONSUMER_KEY',
'consumerSecret' => 'YOUR_CONSUMER_KEY_SECRET'
);
$consumer = new Zend_Oauth_Consumer($options);
if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer->getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer->redirect();
// Here, the user is redirected to the service login page if no session is found on the browser
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
$_SESSION['ACCESS_TOKEN'] = null; // forces reset of access token on all example runs
}
// the client is a Zend_Http_Client subclass with built-in OAuth request handling
$client = $token->getHttpClient($options);
$client->setUri('http://ma.gnolia.com/api/rest/2/bookmarks_count'); // we're counting!
$client->setMethod(Zend_Http_Client::POST);
$client->setParameterPost('group','oauth'); // bookmarks for the OAuth Group
$response = $client->request();
header('Content-Type: ' . $response->getHeader('Content-Type'));
echo $response->getBody();
// Retrieved XML will be similar to:
// <?xml version="1.0" encoding="utf-8" ?>
// <response status="ok" version="">
// <count>138</count>
// </response>
On voit bien qu’une fois le Token créé, les appels sont extrêmement simples à effectuer.
Maintenant que vous savez tout ça, à vous de jouer avec Google, Facebook, Twitter etc…
N’hésitez pas à poser vos questions si besoin.
Les samples de code sont issues de la page WIKI de zend.
Happy coding !
Comments
Leave a Reply
