tfeserver: Blog de tfe

html, scripts et tout un tas de trucs...

OAuth Perl CGI et Twitter

publié le Fri, 24 Dec 2010 12:05:01 GMT, dans la categorie Perl

Après la courte explication sur ce qu'était OAuth, voila un autre billet sur son utilisation avec Perl (en CGI).

Résumé des étapes à effectuer

  1. Obtenir le "request token" de twitter
  2. Rediriger l'utilisateur vers la page d'autorisation de twitter
  3. Obtenir l' "access token" de twitter
  4. Utiliser l'access token pour modifier son statut twitter par exemple

Pour l'ensemble de ces étapes, nous utiliserons le module Net::OAuth du CPAN.

Note importante: vous remarquerez que j'utilise un hash %tokens dans le code qui me permets de mémoriser l'association token -> token_secret et l'utiliser plus tard lors de la réception du access token. Cela n'est permis que si vous utilisez FastCGI. En mode CGI classique, vous devrez enregistrer cette association dans une base de donnée.

Préliminaires

Pour utiliser l'identification OAuth, votre page doit être connue des services de twitter. La première étape consiste à créer une application, pour obtenir les différents éléments essentiels à l'identification:

  • Consumer key: Clé d'identification de votre page
  • Consumer secret: Clé de chiffrement

Request token

Le serveur va tout d'abord demander un request_token à twitter pour rediriger celui-ci vers une page d'autorisation.

use Encode;
use Net::OAuth;
use LWP::UserAgent;
use URI::Escape;
use HTTP::Request::Common qw(POST);
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;
    

my $url_request = "https://api.twitter.com/oauth/request_token";
my $url_authorize = "http://api.twitter.com/oauth/authorize";
my $url_access = "https://api.twitter.com/oauth/access_token";
my $url_update = "https://api.twitter.com/1/statuses/update.xml";

my %tokens = (); 
my $consumer_key="votre cle";
my $consumer_secret="votre cle de chiffrement";
my $nonce="dwadwadwa"; # caratères aléatoires

my $callback="http://monhost/cgi-bin/monscript.pl";
my $request = Net::OAuth->request("request token")->new(
        consumer_key => $consumer_key,
        consumer_secret => $consumer_secret,
        request_url => $url_request,
        request_method => 'POST',
        signature_method => 'HMAC-SHA1',
        timestamp => time,
        nonce => $nonce,
        callback => $callback
        );  

$request->sign;


my $ua = LWP::UserAgent->new;
my $res = $ua->request(HTTP::Request::Common::POST $request->to_url); # Post message to the Service Provider

if ($res->is_success) {
    my $response = Net::OAuth->response('request token')->from_post_body($res->content);
    print "Status: 200 OK\nLocation: $url_authorize?oauth_token=".$response->token."\n\n";
    $tokens{$response->token} = $response->token_secret;
}
else {
    print "ERROR";
}

Access token

Cette page est visitée automatiquement par l'utilisateur une fois acceptée l'autorisation. On reçoit deux paramètres via GET: oauth_token et oauth_verifier.

Nous devons vérifier ces valeurs auprès de twitter qui nous donnera en résultat le code définitif d'accès: access token y token secret.

my $token = "testestes" ; # récupéré via GET HTTP de oauth_token
my $token_verifier = "testieum"; # Récupéré via GET HTTP de oauth_verifier
# Cle de chiffrement que nous avions recu lors de la recuperation
# du request token
my $token_secret = "le token secret";

my $request = Net::OAuth->request("access token")->new(
        consumer_key => $consumer_key,
        consumer_secret => $consumer_secret,
        request_url => $url_access,
        request_method => 'POST',
        signature_method => 'HMAC-SHA1',
        verifier => $token_verifier,
        token => $token,
        token_secret => $token_secret,
        timestamp => time,
        nonce => $nonce,
        );  
$request->sign;

my $ua = LWP::UserAgent->new;
my $res = $ua->request(HTTP::Request::Common::POST $request->to_url); # Post message to the Service Provider

if ($res->is_success) {
    my $response = Net::OAuth->response('access token')->from_post_body($res->content);
    print "Status: 200 OK\nContent-type: text/html\n\n";
    print "Token final: $response->token\n";
    print "Token secret final: $response->token_secret\n";
}
else {
    print "Error recuperacion token!";
}

Envoie de message

Pour l'envoie du message, nous utilisons les token et token secret de l'utilisateur.

Les paramètres du message envoyé à la page se font via le champs extra_params.

my $request = Net::OAuth->request("protected resource")->new(
            consumer_key => $consumer_key,
            consumer_secret => $consumer_secret,
            token => $token,
            token_secret => $token_secret,
            request_url => $url_update,
            request_method => 'POST',
            signature_method => 'HMAC-SHA1',
            timestamp => time,
            nonce => $nonce,
            extra_params => {status => Encode::decode_utf8($message)}
            );  
$request->sign;
my $ua = LWP::UserAgent->new;
my $res = $ua->request(HTTP::Request::Common::POST $request->to_url); # Post message to the Service Provider

if ($res->is_success) {
        my $response = Net::OAuth->response('request token')->from_post_body($res->content);
        print "Status: 200 OK\nLocation: $url_authorize?oauth_token=".$response->token."\n\n";
        $tokens{$response->token} = $response->token_secret;
}
else { 
 # Gestion d'erreur...
}

Nouveau commentaire

Pseudo:
Site:
Email:
AntiSpam (2+2=?):
Message:
Validation: