Après la courte explication sur ce qu'était OAuth, voila un autre billet sur son utilisation avec Perl (en CGI).
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.
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:
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";
}
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!";
}
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...
}