Twitter-Applikationen mit Zend_Oauth
Kurz vorab: Ich möchte mich bei euch Lesern bedanken, ihr habt mich dazu gebracht hier nun den 100. Artikel zu verfassen. Außerdem folgen mir aktuell 98 Leute bei Twitter (vielleicht werden es ja heute 100?), wenn das kein Grund zu feiern ist! Danke euch dafür! Doch nun gehts los:
In den Kommentaren zu meinem Artikel über das Twittern via PHP wurde ich darum gebeten die Twitter-API-Benutzung auch mittels OAuth zu zeigen. Das werde ich hier nun tun, mit einer kleinen Erklärung zu OAuth und dann natürlich auch PHP-Code.
Doch was ist OAuth? Normalerweise nutzt man zur API-Kommunikation die Twitter-Login-Informationen. Nehmen wir an wir wollen einen kleinen Dienst im Internet anbieten, den andere Leute nutzen können. Dabei soll unser Dienst auf den Account der Nutzer zugreifen und Daten auslesen oder gar verändern. Damit wir den Dienst umsetzen können müssen unsere Nutzer also ihre Login-Usernamen und Passwörter bei uns eintragen. Damit verfügen wir über die volle Kontrolle über diese Accounts, könnten sie also auch löschen, das Passwort ändern usw. Da sicherheitsbewusste Benutzer ihr Passwort nicht hergeben, wird niemand unseren Dienst nutzen. Von dem Problem, dass der Nutzer bei einem Passwortwechsel auch alle Applikationen in Kenntnis setzen müßte mal ganz abgesehen.
OAuth ist nun eine Möglichkeit, unserer Applikation begrenzten Zugang zu den Accounts zu geben, aber nicht mittels dem normalen Login-Passwort, sondern einem extra Passwort (Access-Token) für die Kombination aus unserer Applikation und dem Nutzerkonto. Dieser Zugang kann dann auch beschränkt werden zum Beispiel auf nur lesenden Zugriff. Außerdem kann der Zugang wieder entzogen werden. Der Accountbesitzer behält also die volle Kontrolle über seinen Account.
Unser Vorgehen sieht nun wie folgt aus:
- Unsere Applikation benötigt von Twitter einen sogenannten Consumer-Key und ein Consumer-Secret. Das müssen wir uns von Twitter besorgen und identifiziert unsere Applikation später beim Token-Austausch. Außerdem wird beides dann zu einer Art Verschlüsselung beim Token-Austausch genutzt.
- Nachdem der potentielle Nutzer nun auf unsere Webseite gegangen ist müssen wir uns für ihn einen Token besorgen. Dazu holen wir uns einen temporären unauthorisierten Token von Twitter.
- Mit diesem unauthorisierten Token leiten wir den User auf eine Seite von Twitter, wo er dann gefragt wird, ob er unserer Applikation den begrenzten API-Zugriff erlauben möchte. Falls er das tut, wird er zurück auf unsere Seite geleitet
- Wir erhalten nun den authorisierten Token, den wir in einer Datenbank abspeichern. Ab jetzt können wir auf das Nutzerkonto zugreifen, und der Nutzer hat seine Twitter-Logininformation nicht preisgeben müssen.
Da diese OAuth-Kommunikation standardisiert ist und im Detail auch etwas komplizierter, werden wir das nicht selbst implementieren sondern die Zend_Oauth-Klasse nutzen. Seit Zend Framework 1.10 ist diese im Lieferumfang enthalten. Es gibt auch noch weitere OAuth-Klassen, die genutzt werden können. Danach werden wir in Zusammenspiel mit Zend_Service_Twitter auf den Account zugreifen und einen Tweet absetzen.
Fangen wir also an:
Um den Consumer-Key und das Consumer-Secret zu erhalten registrieren wir unsere neue Applikation: http://twitter.com/oauth_clients
Wir benötigen auch Write-Rechte, da wir ja einen Tweet absetzen möchten. Nach erfolgreicher Applikationsregistrierung erhalten wie die besagten beiden Informationen:
Nun schreiben wir unsere kleine Testapplikation. Darin sind die Punkte 2-4 abgehandelt. Der Einfachkeit halber speichern wir den ACCESS_TOKEN nur in der Session, normalerweise würde man diesen zu den Nutzerinformationen in die Datenbank schreiben.
<?php session_start(); require_once 'Zend/Oauth/Consumer.php'; $options = array( 'callbackUrl' => 'https://www.phpgangsta.de/twitter.php', 'siteUrl' => 'http://twitter.com/oauth', 'consumerKey' => '4c2jXXXXXXXXXXXXXXBkw', 'consumerSecret' => 'iPkXiOXXXXXXXXXXXXXXXXXXXXXXbSAJRhE', ); $consumer = new Zend_Oauth_Consumer($options); if (!isset($_SESSION['ACCESS_TOKEN'])) { if (empty($_GET)) { $token = $consumer->getRequestToken(); $_SESSION['REQUEST_TOKEN'] = serialize($token); $consumer->redirect(); } else { $token = $consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN'])); $_SESSION['ACCESS_TOKEN'] = serialize($token); unset($_SESSION['REQUEST_TOKEN']); } } if (isset($_SESSION['ACCESS_TOKEN'])) { $token = unserialize($_SESSION['ACCESS_TOKEN']); $client = $token->getHttpClient($options); require_once 'Zend/Service/Twitter.php'; $twitter = new Zend_Service_Twitter(); $twitter->setLocalHttpClient($client); $response = $twitter->status->update('Nachricht gesendet authentifiziert via OAuth'); }
Der Ablauf ist klar und wie oben beschrieben: Das Script holt sich einen Request-Token, der Nutzer wird dann auf die Twitter-Seite redirected und gefragt ob er den Zugriff erlauben möchte. Danach kommt er zurück auf unsere Seite (die wir bei der Registrierung angegeben haben, man kann diese auch mit dem Request abändern), wir holen uns aus den GET-Parametern den ACCESS_TOKEN und speichern ihn (in der Session). Danach können wir den TOKEN nutzen um zu twittern.
Dazu können wir entweder die oben beschriebene Methode nutzen und mit Hilfe des $token einen Http_Client erstellen den wir dann an den Twitter-Service geben. Dieser Client erledigt das Mitsenden der OAuth-Informationen bei jedem Request automatisch für uns. Oder aber wir nutzen den Http_Client direkt:
$client = $token->getHttpClient($options); $client->setUri('http://twitter.com/statuses/update.json'); $client->setMethod(Zend_Http_Client::POST); $client->setParameterPost('status', 'Nachricht gesendet authentifiziert via OAuth'); $response = $client->request();
Natürlich kann man die vergebenen Berechtigungen an Applikationen auch zurückziehen. Das geht auf der Seite https://twitter.com/account/connections:
Das war es auch schon für heute, ich hoffe das Prinzip von OAuth ist etwas klarer geworden und ihr könnt den Code nutzen um eigene Twitter-Applikationen zu erstellen.
Hier noch einige interessante Links zu (englischsprachigen) Tutorials und Übersichtsseiten:
[…] https://www.phpgangsta.de/twitter-applikationen-mit-zend_oauth […]
Zend Framework News » Blog Archive » Zend_Oauth für eine Twitter-Applikation verwenden
14 Mrz 10 at 17:59
[…] Edit: Auf vielfachen Wunsch hin habe ich einen weiteren Artikel verfasst über die Nutzung von Twitter mit OAuth. […]
Verschiedene Möglichkeiten, mit PHP zu twittern | PHP Gangsta - Der PHP Blog
14 Mrz 10 at 22:10
[…] Nutzung der Twitter API über OAuth mit Hilfe des Zend Frameworks. […]
Linkhub – Woche 10-2010 « pehbehbeh
15 Mrz 10 at 10:14
[…] Wer sich für OAuth mit dem Zend Framework + Twitter interessiert findet beim PHPGansta ein sehr gutes deutsches Tutorial zum Einrichten. Das ganze haben wir gerade selber ausprobiert, und es klappt wunderbar. So lange man beim Applikations – Type auch wirklich “Browser” auswählt. (OAuth mit Zend Framework und Twitter). […]
LimeSpace – IT » Neues rund um das Zend Framework
31 Mrz 10 at 07:02
Vielen Dank für das Tutorial. In meinem Fall sollen jedoch Tweets automatisiert an Twitter übergeben werden, ohne dass man noch mal einen Bestätigungs-Button klicken muss (Überschriften meiner Blog-Beiträgen sollen in meinen eigenen Twitter-Account übermittelt werden). Da wäre es natürlich unschön, wenn ich erst einen Bestätigungs-Button klicken müsste. Gibt es für meinen Fall auch eine Lösung mit oauth und ohne Bestätigungs-Button?
Mathias
7 Sep 10 at 10:26
Hi,
ich versuche gerade vergeblich Dein Script zum laufen zu bringen, bekomme aber stets die folgende Fehlermeldung:
Catchable fatal error: Argument 2 passed to Zend_Oauth_Consumer::getAccessToken() must be an instance of Zend_Oauth_Token_Request, boolean given, called in /twitter.php on line 21
Hab alles nach Deiner Anleitung gemacht und komme da irgendwie nicht weiter. Hast Du ne spontane Idee woran es liegen könnte?
Danke für eine kurze Antwort.
Gruß
Pinky
Pinky
13 Sep 10 at 22:39
@Pinky: Ich glaube du hast eine zu neue ZendFramework Version 😉
Ab der Version 1.10.6 wurde die Twitter-Komponente geändert, siehe diese News:
http://devzone.zend.com/article/12481-Zend-Framework-1.10.8-Released
OAuth ist also nun stärker integriert, da es (durch die OAuthcalypse) Pflicht geworden ist.
Michael Kliewe
14 Sep 10 at 11:23
[…] Für deutsche Entwickler gibt es aber eine noch viel bessere Ressource: https://www.phpgangsta.de/twitter-applikationen-mit-zend_oauth […]
Ohne oauth liegen die Twitterprogramme brach « Raumsurfen im Open Space
5 Okt 10 at 13:56
Ich stoße auf das Problem, dass man jedes Mal der Api die Erlaubnis erteilen muss um Zugriff auf den Twitter Account zu erhalten.
Ich will jedoch dass status-updates automtisch erstellt werden per script ohne jdesmal die Erlaubnis erteilen zu müssen.
Jemand eine Idee?
supergoofy
22 Jan 11 at 16:46
@supergoofy: Wie im Artikel steht musst du dann den ACCESS_TOKEN in einer Datenbank oder ähnlichem speichern, der gilt nämlich solange bis der Zugriff zurückgezogen wird.
Also einfach irgendwo persistent speichern (oben im Beispiel wird er nur in der Session gespeichert), und dann hast du permanent Zugriff und kannst Status-Updates senden.
Michael Kliewe
22 Jan 11 at 17:35
Ich will per PHP jeweils einen Tweet losschicken, sobald eine Webseite aufgerufen wird. Die Auswahlmöglichkeit read&write / read-only wird mir beim Holen der Keys nicht angezeigt.
Claus
26 Okt 11 at 00:07
best wireless security camera
dropcam pro
7 Jun 18 at 06:02