OAuth mit PHP am Beispiel der Twitter API

Auf den ersten Blick ist OAuth eine scheißkomplizierte Sache, aber mit dieser kurzen Anleitung und dem Zend Framework wird es plötzlich ganz einfach …

“Signierte Requests”, “Request- und Access-Token” … alles nicht so schlimm wie es sich anhört. Die Zend_Oauth_Consumer Klasse von Zend Framework nimmt einem die meiste Arbeit ab. Am Beispiel von Twitter zeig ich mal schnell wie das geht.

Allgemein
Der grundsätzliche Ablauf ist folgender: Als erstes bei der API einen Request-Token anfordern, mit diesem Token dann den Benutzer auf die Twitter-Seite umleiten (Redirect) und wenn der Benutzer auf “Erlauben” klickt wird man zurück auf die eigene Seite umgeleitet und bekommt einen Access-Token.

Für den ganzen Ablauf muß man sich vorher von Twitter einen consumerKey und consumerSecret abholen, dazu muß die eigene Anwendung, die auf die Twitter API zugreifen will, registriert werden. Das kann man unter folgender URL machen: http://dev.twitter.com/apps/new

 
$config= array(
	'callbackUrl' => 'http://bohuco.net/labs/twitter-backup',
	'siteUrl' => 'http://twitter.com/oauth',
	'consumerKey' => 'ueQgVFLypAzN0vkbiZiyw',
	'consumerSecret' => '9SB9W8J66lPsKyu766bzGpoPN21q0tjJh6JV1Rp8'
);

Request Token anfordern
Der Request Token dient dazu die nachfolgende Anfrage zu signieren und gilt immer nur für einen Request. Man braucht ihn also für den nachfolgenden Redirect auf die Twitter-Authorize Seite. Den Request Token muß man aufheben weil man damit die Antwort von Twitter wieder entschlüsseln muß darum speichern wir ihn in der Session.

	$consumer = new Zend_Oauth_Consumer($config);
	$token = $consumer->getRequestToken();
	$_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);

Wenn man den Request Token in der Session hinterlegt hat kann man den Benutzer auf die Twitter Seite umleiten und hoffen das er mit einer positiven Antwort zurückkommt …

	$consumer->redirect();

Falls der Benutzer dann wirklich zurückkommt wird mittels Request-Token (aus der Session) und der Antwort von Twitter (die in $_GET steht) der Access-Token erzeugt. Den Access-Token kann man entweder in der Session oder in der Datenbank speichern, er läuft nicht ab und gilt solange bis der Benutzer diese Berechtigung bei Twitter wieder aufhebt.

Den Request-Token kann man vergessen den braucht man jetzt nicht mehr.

	$consumer = new Zend_Oauth_Consumer($config);
	$_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['TWITTER_REQUEST_TOKEN'])));
	$_SESSION['TWITTER_REQUEST_TOKEN'] = null;

Der gesamte Quelltext würde dann ca. so aussehen …

 
$config = array(
	'callbackUrl' => 'http://bohuco.net/labs/twitter-backup',
	'siteUrl' => 'http://twitter.com/oauth',
	'consumerKey' => 'ueQgVFLypAzN0vkbiZiyw',
	'consumerSecret' => '9SB9W8J66lPsKyu766bzGpoPN21q0tjJh6JV1Rp8'
);
 
// get request token and redirect user to twitter authorize page
if (! isset($_SESSION['TWITTER_ACCESS_TOKEN'])) {
	$consumer = new Zend_Oauth_Consumer($config);
	$token = $consumer->getRequestToken();
	$_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);
	$consumer->redirect();
}
 
// user come back from twitter
if (! empty($_GET) && isset($_SESSION['TWITTER_REQUEST_TOKEN'])) {
	$consumer = new Zend_Oauth_Consumer($config);
	$_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['TWITTER_REQUEST_TOKEN'])));
	$_SESSION['TWITTER_REQUEST_TOKEN'] = null;
}
 
// user has granted access ... now we can use the api
if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])) {
 
	$token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
	$userName = $token->screen_name;
 
	$twitter = new Zend_Service_Twitter(array(
		'username' => $userName,
		'accessToken' => $token
	));
 
	$status = $twitter->account->rateLimitStatus();
	// ...
}