Authentifizieren mit OAuth am Beispiel von Twitter

Mit dem Automatisieren des Webdienstes Twitter hat Access im Unternehmen sich bereits beschäftigt. Allerdings hat Twitter mittlerweile die Authentifizierungsmethode gewechselt – auf das sogenannte OAuth. Die Programmierung des Zugriffs ist nicht ganz trivial, vor allem wegen der Erzeugung des notwendigen HMAC-SHA1-Ausdrucks, der zur Authentifizierung der Anfrage dient. Wie dies gelöst wurde und wie der Zugriff auf Twitter nun funktioniert, erfahren Sie in diesem Beitrag.

Im Beitrag Twittern mit Access (www.access-im-unternehmen.de/715) haben wir uns erstmalig mit Twitter beschäftigt. Damals gelang der Zugriff auf den Twitter-Webdienst noch über das einfache Basic Auth.

Im Herbst 2010 hat Twitter dies jedoch auf OAuth umgestellt. Der Beitrag Twittern mit Access, Update (www.access-im-unternehmen.de/774) lieferte eine erste Möglichkeit, mit OAuth zu arbeiten und somit wieder per VBA am Twitter-Geschehen teilnehmen zu können.

Dies gelang über einen externen Anbieter, der die Authentifizierung auf Basis der übermittelten Daten vorgenommen hat. Die Performance leidet hier natürlich, außerdem weiß man nie, ob dieser (kostenlose) Anbieter nicht früher oder später seine Pforten schließt.

Also wirft der vorliegende Beitrag einen etwas genaueren Blick auf OAuth. Vollständig zu entschlüsseln brauchten wir dies nicht – im Internet fand sich der eine oder andere Codeschnipsel, der die Lösung erleichterte.

Grundlagen

Grundlegende Informationen zu Twitter finden Sie im Beitrag Twittern mit Access (www.access-im-unternehmen.de/715) und natürlich auf twitter.com selbst.

Voraussetzungen

Für den Zugriff auf die Twitter-Schnittstelle per OAuth-Authentifizierung benötigen Sie einige Informationen. Als Erstes müssen Sie einen Twitter-Account anlegen, was Sie unter twitter.com erledigen können (siehe Bild 1). Im nächsten Schritt bestätigen Sie dann die Benutzungsrichtlinien und erstellen Ihr Konto. Sie können dann einige Benutzer auswählen, denen Sie folgen und deren Statusmeldungen Sie lesen möchten. Sie erhalten eine Bestätigungs-E-Mail von Twitter, die einen Link zum Abschließen des Registrierungsvorgangs enthält.

pic001.png

Bild 1: Registrieren bei twitter.com

Anwendung erstellen

Wechseln Sie nach erfolgter Registrierung zu dev.twitter.com. Klicken Sie dort oben auf Your Apps. Es erscheint die Übersicht der Anwendungen des aktuellen Kontos. Wenn Sie noch keine Anwendung erstellt haben, erledigen Sie dies jetzt mit einem Klick auf den Link Register a new application (s. Bild 2).

pic002.png

Bild 2: Erstellen einer neuen Anwendung

Im folgenden Dialog tragen Sie nun die Eigenschaften der Anwendung ein (s. Bild 3):

pic003.png

Bild 3: Eingeben der Anwendungsdaten

  • Application Name: Name der Anwendung, darf nicht Twitter enthalten
  • Description: Beschreibung
  • Application Website: Webadresse, unter der Benutzer die Anwendung herunterladen können, darf nicht leer sein
  • Application Type: Anwendungstyp, hier Client auswählen
  • Default Access Type: Zugriffsart, hier Read, Write And Direct Messages auswählen

Nach der Eingabe des Captcha-Codes registriert Twitter Ihre Anwendung. Auf der folgenden Seite erhalten Sie dann wichtige Informationen, die Sie später etwa zum Authentifizieren vor dem Zugriff auf twitter.com via VBA benötigen (s. Bild 4).

pic005.png

Bild 4: Informationen zur Authentifizierung

Wo Sie gerade einmal hier sind: In der Beispieldatenbank zu diesem Beitrag finden Sie eine Tabelle namens tblApplications (s. Bild 4 liefert beispielsweise die Werte für die Felder ConsumerKey und ConsumerSecret. Für ApplicationName können Sie den Namen der Anwendung eintragen (dieses Feld dient lediglich der Identifizierung der zugeordneten Anwendung und hat keine Bedeutung für die Anwendung). SignatureMethod erhält den Wert HMAC-SHA1, für die Version legen Sie den Wert 1.0 fest.

pic004.png

Bild 5: Tabelle zum Speichern der Zugriffsdaten

Die beiden übrigen Werte Token und TokenSecret erhalten Sie, wenn Sie rechts auf den Link My Access Token klicken. Tragen Sie die beiden Werte aus der nun erscheinenden Übersicht (s. Bild 6) in die Tabelle tblApplications ein.

pic006.png

Bild 6: Ermitteln von Access Token und Secret

Damit sind die Arbeiten auf twitter.com abgeschlossen – später werden Sie hier allerdings nachschauen, ob die von Access aus gesendeten Statusmeldungen auch dort angekommen sind.

Basisausstattung

Um das Rad nicht neu zu erfinden, bauen wir die Lösung dieses Beitrags auf der aus Twittern mit Access (www.access-im-unternehmen.de/715) auf. Dort hatten wir bereits ein Formular programmiert, das vorhandene Statusmeldungen anzeigte und das Absenden neuer Statusmeldungen ermöglichte. Außerdem konnten Sie dort vorhandene Statusmeldungen löschen (s. Bild 7).

pic007.png

Bild 7: Die Benutzeroberfläche des Beispielformulars

Ein wichtiger Unterschied zur damaligen Lösung besteht darin, dass das Kombinationsfeld nicht mehr zur Auswahl eines Benutzers dient, sondern zur Ermittlung der zu verwendenden Anwendungsdaten. Wenn Sie mehrere Applications unter Ihrem Account anlegen möchten, können Sie die damit zusammenhängenden Daten in verschiedenen Datensätzen der Tabelle tblApplications speichern.

Grundsätzlich ist die Beispiellösung als Single-User-Lösung zu betrachten. Sie können damit zwar verschiedene Daten von Twitter lesen (wie Benutzerdaten, Tweets, Follower et cetera), aber nur Statusmeldungen für den Benutzer erstellen oder löschen, in dessen Kontext Sie die Application bei Twitter erstellt haben.

Grundsätzlich ist es möglich, mit einer Anwendung auch die Daten anderer Benutzer zu ändern – das wäre interessant, wenn Sie die Beispiellösung nicht nur für sich selbst verwenden wollen, sondern diese an andere Benutzer weitergeben möchten.

Diese melden sich dann mit ihren eigenen Daten an und können selbst Statusmeldungen erstellen und löschen, Direktnachrichten versenden und so weiter. Der dazu nötige Workflow ist allerdings noch ein wenig aufwendiger als der nachfolgend vorgestellte. Gegebenenfalls gehen wir in einem weiteren Beitrag auf diese Erweiterung ein.

Formular der Beispiellösung

Das Formular stellt also zunächst ein Kombinationsfeld zur Auswahl der zu verwendenden Anwendungsdaten zur Verfügung, das mit den ersten beiden Feldern der Tabelle tblApplications als Datensatzherkunft gefüllt ist.

Beim Öffnen des Formulars stellt die folgende, durch das Ereignis Beim Laden ausgelöste Prozedur zunächst das Kombinationsfeld auf den ersten Eintrag ein.

Außerdem ruft sie die Prozedur TweetsLaden auf, die für das Füllen des Listenfeldes mit Ihren letzten Statusmeldungen verantwortlich ist:

Private Sub Form_Load()
    Me!cboApplication = _
    Me!cboApplication.ItemData(0)
    Call TweetsLaden
    End Sub

Die Prozedur TweetsLaden ruft wiederum eine Funktion namens GetTweets_Listbox auf, die eine Zeichenkette mit den im Listenfeld anzuzeigenden Daten zurückliefert. Das Ergebnis landet umgehend in der Eigenschaft RowSource des Listenfelds und sieht beispielsweise so aus:

"85580978990493696";"28.06.2011 05:31:10";"Beispielstatusmeldung";"83562060692209664";"22.06.2011 15:48:42";"Noch eine Beispielstatusmeldung";...

Danach markiert die Prozedur den ersten Eintrag des Listenfeldes und ruft die Routine TweetAnzeigen auf:

Private Sub TweetsLaden()
    Me!lstTweets.RowSource = GetTweets_Listbox(Me!cboApplication)
    Me!lstTweets = Me!lstTweets.ItemData(0)
    Call TweetAnzeigen
    End Sub

TweetAnzeigen hat nichts weiter zu tun, als das Datum der aktuell markierten Statusmeldung und ihren Text aus der Datensatzherkunft des Listenfeldes auszulesen und in die beiden Textfelder txtDatum und txtTweet einzutragen:

Private Sub TweetAnzeigen()
    Me!txtDatum = Me!lstTweets.Column(1)
    Me!txtTweet = Me!lstTweets.Column(2)
    End Sub

Ein Klick auf einen der übrigen Einträge im Listenfeld löst die folgende Ereignisprozedur aus, die ebenfalls die Prozedur zum Anzeigen der Details der Statusmeldung aufruft:

Private Sub lstTweets_AfterUpdate()
    TweetAnzeigen
    End Sub

Das Aktualisieren des Listenfeldes erreicht der Benutzer durch einen Klick auf die Schaltfläche cmdTweetsLaden:

Private Sub cmdTweetsLaden_Click()
    Call TweetsLaden
    End Sub

Neue Statusmeldungen schreibt der Benutzer in das Textfeld txtNeuerTweet. Damit der Benutzer immer weiß, wie viele Zeichen noch verbleiben, löst das Eingeben eines Zeichens jeweils das Ereignis Bei änderung aus. Die entsprechende Ereignisprozedur sieht wie folgt aus:

Private Sub txtNeuerTweet_Change()
    Dim intZeichenUebrig As Integer
    Dim intPos As Integer
    intZeichenUebrig = _
    140 - Len(Me!txtNeuerTweet.Text)
    If intZeichenUebrig < 0 Then
        intPos = Me!txtNeuerTweet.SelStart
        Me!txtNeuerTweet = strTweet
        Me!txtNeuerTweet.SelStart = intPos - 1
    Else
        Me!txtZeichenUebrig = intZeichenUebrig
        strTweet = Me!txtNeuerTweet.Text
    End If
    End Sub

Sie ermittelt aus der aktuellen Textlänge die verbleibenden Zeichen. Ist die Anzahl der Zeichen größer oder gleich 0, wird der aktuelle Text in der Variablen strTweet gespeichert. Sollte diese Anzahl kleiner als 0 werden, stellt die Prozedur den Text vor der Eingabe dieses Zeichens aus der Variablen strTweet wieder her. Zum Absenden der Statusmeldung klickt der Benutzer auf die Schaltfläche cmdTweetSenden. Diese ruft die Funktion NeuerStatus auf, die nach dem erfolgreichen Versenden die ID der neuen Statusmeldung zurückliefert. Ist dies der Fall, sorgt ein erneuter Aufruf der Prozedur TweetsLaden dafür, dass das Listenfeld der zuletzt erstellten Statusmeldungen aktualisiert wird:

Private Sub cmdTweetSenden_Click()
    Dim strID As String
    strID = NeuerStatus(Me!cboApplication, _
    Me!txtNeuerTweet)
    If Len(strID) > 0 Then
        Call TweetsLaden
    End If
    End Sub

Fehlt nur noch das Löschen der aktuell markierten Statusmeldung. Dies wird durch einen Klick auf die Schaltfläche cmdTweetLoeschen erreicht.

Die folgende Prozedur ruft dann die Funktion StatusLoeschen auf, die nach erfolgter Löschung den Wert True zurückliefert. Dies wird durch das Aktualisieren des Listenfeldes quittiert:

Private Sub cmdTweetLoeschen_Click()
    If StatusLoeschen(Me!cboApplication, _
    Me!lstTweets) = True Then
    Call TweetsLaden
End If
End Sub

Dies zur Funktionsweise des Formulars – in den folgenden Abschnitten schauen wir uns an, was unter der Haube passiert, sprich: Wie der Zugriff auf die Twitter-API vonstatten geht.

Grundlegender Zugriff auf Twitter

Um es vorwegzunehmen: Der Zugriff auf die Twitter-API mit der Authentifizierung per OAuth ist sehr aufwendig im Vergleich mit der zuvor möglichen Anmeldung per Basic Auth.

Für den Zugriff benötigen Sie zunächst einmal eine Reihe Parameter, die zum größten Teil aus der Tabelle tblApplications bezogen werden können. Zusätzlich benötigen Sie den Link für den Zugriff auf die gewünschte API-Funktion und die Zugriffsart (POST/GET).

Den Link für den Zugriff entnehmen Sie der Dokumentation, für das Versenden einer neuen Statusmeldung etwa unter http://dev.twitter.com/doc/post/statuses/update. Auf dieser Seite finden Sie am rechten Rand Links zu allen möglichen Aktionen, die Sie mit der Twitter-API ausführen können.

Für das Aktualisieren des Status rufen Sie beispielsweise die folgende Adresse auf:

http://api.twitter.com/[version]/statuses/update.[format]

Die Platzhalter [version] und [format] ersetzen wir in der Beispiellösung durch 1 und xml. In der Dokumentation erfahren Sie auch, dass das Aktualisieren des Status eine POST-Anfrage nötig macht und dass eine Authentifizierung nötig ist.

Die API-Funktion erwartet außerdem einen Parameter namens status, der den Text der neuen Statusmeldung enthält. Der nackte Aufruf zum ändern des aktuellen Status sieht also etwa so aus:

http://api.twitter.com/1/statuses/update.xmlstatus=Dies%20ist%20ein%20neuer%20Status

Leer- und Sonderzeichen in der als Parameter übergebenen Statusmeldung werden durch URL-encodierte Zeichen ersetzt, beim Leerzeichen etwa durch %20. Dies entspricht dem ASCII-Code des Leerzeichens (32) in hexadezimaler Schreibweise (20) plus einem vorangestellten Prozentzeichen, damit die API-Funktion die encodierten Zeichen erkennen und entsprechend zurückverwandeln kann.

Nun wäre es leicht, diesen API-Aufruf abzusetzen.Dies ginge beispielsweise so:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar