PHP-OAuth2 : Un excellent client OAuth2 pour PHP5

Dernièrement, j’ai contribué a un projet Open source PHP-OAuth2, qui fournit un client OAuth2 pour PHP5. Le projet est initié et développé par Pierrick Charron et est disponible sur GitHub. Le client permet de se connecter et de consommer n’importe quelle API qui supporte le protocole OAuth2. Dans ce post, nous allons voir comment installer, utiliser et étendre cet outil pour des besoins spécifiques.

Installation

L’installation est simple. Il suffit en fait de récupérer le script via Git :

git clone git://github.com/adoy/PHP-OAuth2.git

Utilisation

Pour utiliser le client, assurez vous tout d’abord que le client est accessible depuis votre code (include, include_path, autoload etc.). Par la suite, vous devez definir 5 constantes :

  • CLIENT_ID : votre identifiant client.
  • CLIENT_SECRET : votre cle secrete.

vous récupérez ces deux valeurs depuis le serveur OAuth2 (Facebook Apps par exemple)

  • REDIRECT_URI : l’url de redirection de votre application.
  • AUTHORIZATION_ENDPOINT : L’url du service d’autorisation
  • TOKEN_ENDPOINT : L’url du service de recuperation des jetons d’acces.
Voici un exemple :
require('client.php');

const CLIENT_ID     = 'your client id';
const CLIENT_SECRET = 'your client secret';

const REDIRECT_URI           = 'http://url/of/this.php';
const AUTHORIZATION_ENDPOINT = 'https://graph.facebook.com/oauth/authorize';
const TOKEN_ENDPOINT         = 'https://graph.facebook.com/oauth/access_token';

$client = new OAuth2\Client(CLIENT_ID, CLIENT_SECRET);
if (!isset($_GET['code']))
{
    $auth_url = $client->getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI);
    header('Location: ' . $auth_url);
    die('Redirect');
}
else
{
    $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI);
    $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params);
    parse_str($response['result'], $info);
    $client->setAccessToken($info['access_token']);
    $response = $client->fetch('https://graph.facebook.com/me');
    var_dump($response, $response['result']);
}

Explication

On instancie tout d’abord le client en lui passant l’identification du client ainsi que la cle secrète. Il y a deux cas a gérer par la suite:

  1. En accédant au script (sans spécifier de code dans l’url), on récupère l’url d’authentification via la méthode getAuthenticationUrl(), et on redirige l’utilisateur vers cette addresse (Dans notre exemple, c’est l’adresse d’authentification de l’utilisateur sur Facebook).
  2. Une fois l’utilisateur authentifié, le serveur le redirige vers notre script en lui fournissant un code d’accès. Dans ce cas, en récupérant le code depuis $_GET, nous allons récupérer un jeton d’accès depuis le service de récupération de jetons. Ceci est effectué via la méthode getAccessToken().
  3. Une fois le jeton d’accès récupéré, il est alors possible de consommer l’api via la méthode fetch().

Assez simple non?

Comment je peux définir des nouveaux types d’accès ?

Si vous utilisez l’API de Facebook, vous n’avez probablement pas besoin d’utiliser ce genre d’opérations. Dans le cas ou vous connectez a un autre service, il est possible que ce dernier vous offre des modes d’accès personnalisés. Il est alors possible d’étendre le client OAuth2 pour supporter ces appels. Il suffit d’écrire alors une nouvelle classe pour ce faire. Voici un exemple :

namespace OAuth2\GrantType;

/**
 * MyCustomGrantType Grant Type
 */
class MyCustomGrantType implements IGrantType
{
    /**
     * Defines the Grant Type
     *
     * @var string  Defaults to 'my_custom_grant_type'.
     */
    const GRANT_TYPE = 'my_custom_grant_type';

    /**
     * Adds a specific Handling of the parameters
     *
     * @return array of Specific parameters to be sent.
     * @param  mixed  $parameters the parameters array (passed by reference)
     */
    public function validateParameters(&$parameters)
    {
        if (!isset($parameters['first_mandatory_parameter']))
        {
            throw new \Exception('The \'first_mandatory_parameter\' parameter must be defined for the Password grant type');
        }
        elseif (!isset($parameters['second_mandatory_parameter']))
        {
            throw new \Exception('The \'seconde_mandatory_parameter\' parameter must be defined for the Password grant type');
        }
    }
}

Vous pouvez alors utiliser la méthode getAccessToken en lui spécifiant le nouveau type d’accès :

$response = $client->getAccessToken(TOKEN_ENDPOINT, 'my_custom_grant_type', $params);

Si vous avez des questions ou des commentaires sur l’utilisation du script ou par rapport au protocole OAuth2, n’hesitez pas!

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...

1 Response

  1. foxmask dit :

    Bonjour,

    Est-ce que Oauth2 fonctionnerait avec l’api Twitter ?

    Je n’en ai pas trouvé de mention particulière chez Twitter, à moins que PHP5-Oauth2 ne soit une “autre” implémentation de Oauth ?
    Ou bien que Oauth2 soit une nouvelle version de Oauth (je viens de tomber là dessus en même temps que je posais ma question http://hueniverse.com/2010/05/introducing-oauth-2-0/) et cette version serait-elle compatible avec la précédente ?

    Tout cela, pour en fin de compte, exploiter une “version” d’Oauth qui marche. Actuellement je n’ai pu mettre en place que celle de Zend après en avoir testé 4 sans succès.

    Merci de votre réponse

    cordialement.

Laisser un commentaire