Twitter-Integration auf dem Windows Phone 7.5

Zwitschern auf Mango (Teil 3)
Kommentare

Windows Developer

Der Artikel „Zwitschern auf Mango“ von Matthias Fischer ist erstmalig erschienen im Windows Developer 9.2012
Anmeldeseite im Browser öffnen
Das Twitter API stellt unter http://api.twitter.com/oauth/authorize

Windows Developer

Der Artikel „Zwitschern auf Mango“ von Matthias Fischer ist erstmalig erschienen im Windows Developer 9.2012

Anmeldeseite im Browser öffnen

Das Twitter API stellt unter http://api.twitter.com/oauth/authorize ein Formular zur Anmeldung des Benutzers bereit. Um den Anmeldevorgang in dem Server zuordnen zu können, wird zusätzlich der eben erhaltene Parameter oauth_token übertragen (Listing 7).

Listing 7

// zur Autorisierungsadresse navigieren
var authorizeUrl = "http://api.twitter.com/oauth/authorize" + "?oauth_token=" + TwitterSettings.Instance.RequestToken;
if (String.IsNullOrEmpty(TwitterSettings.Instance.RequestToken) || String.IsNullOrEmpty(TwitterSettings.Instance.RequestSecret)) {
   // handle fault
   return;
}  

Der Browser wird auf diese Adresse geleitet. Dort meldet der Benutzer sich an. Die Anwendung bekommt nichts von diesem Prozess mit, da er innerhalb des Bowsersteuerelements stattfindet:

Dispatcher.BeginInvoke(() => browser.Navigate(new Uri(authorizeUrl)));  

Jetzt kommt das Ereignis browser.LoadCompleted ins Spiel. Immer, wenn der Browser eine Seite aufgerufen hat, wird dieses Ereignis ausgelöst. Die Anmeldung des Benutzers war dann erfolgreich, wenn der Browser die von dem Entwickler der App angegebene Weiterleitungsseite erreicht. In der Weiterleitung befinden sich das AccessToken und der AccessVerifier. Diese müssen aus dem Browser extrahiert werden, um im nächsten Schritt zur Anforderung des AccessToken und des AccessSecret an den Server gesendet zu werden. Der Verifier ist ein Bestätigungscode vom Server, mit dessen Hilfe er bei dem kommenden Aufruf erkennen kann, ob der Benutzer wirklich nach einer erfolgreichen Anmeldung auf die entsprechende Seite weitergeleitet wurde oder nicht:

if (!args.Uri.OriginalString.StartsWith("http://dotnetautor.de/oauth.html")) return;

// Autorisierungstoken und oauth_verifier extrahieren
var qs = new QueryString(args.Uri.OriginalString);  

Hinweis: Gibt der Entwickler keine eigene Weiterleitungsseite an, erscheint anstelle der Weiterleitungsseite eine PIN auf dem Webbrowser. Der Anwender muss dann die PIN manuell eingeben, die als Verifier an den Server gesendet wird.

Anfordern der Zugriffs-Token

Das Twitter-API stellt unter http://api.twitter.com/oauth/access_token eine weitere Funktion zum Anfordern des AccessToken und des AccessSecret bereit, die später bei jedem Funktionsaufruf mit übertragen werden müssen. Der Aufruf erfolgt ähnlich dem ersten REST-API-Aufruf. Zusätzlich zu den bereits im ersten Schritt übertragenen OAuth-Parametern kommen jetzt noch die beiden vom Browser extrahierten Parameter {„oauth_token“,qs[„oauth_token“]} und {„oauth_verifier“,qs[„oauth_verifier“]} hinzu. Alle weiteren Schritte der Anforderung sind analog der ersten Anforderung. Nachdem die Antwort erfolgreich empfangen wurde, können jetzt der AccessToken, der AccessSecret, der UserName und die UserId aus der Antwort extrahiert werden (Listing 8).

Listing 8

// Auslesen der ZugriffsToken
var qs1 = new QueryString(responseText);
TwitterSettings.Instance.AuthToken = qs1["oauth_token"];
TwitterSettings.Instance.AuthSecret = qs1["oauth_token_secret"];
TwitterSettings.Instance.UserId = qs1["user_id"];
TwitterSettings.Instance.UserName = qs1["screen_name"];  

Als letzter Schritt der Anmeldung kann die Anmeldeseite in dem Telefon wieder verlassen werden:

Dispatcher.BeginInvoke(() =>NavigationService.GoBack());  
Ein Tweet senden

Bevor die Funktion zum Senden eines Tweets aufgerufen werden kann, sollte zunächst überprüft werden, ob alle Token vorhanden sind. Ist das nicht der Fall, müssen sie angefordert werden, dazu genügt es, auf die Anmeldeseite zu navigieren:

if (string.IsNullOrWhiteSpace(TwitterSettings.Instance.RequestToken)) {
    NavigationService.Navigate(new Uri("/TwitterAuthPage.xaml", UriKind.RelativeOrAbsolute));
  } else {
    SendTwitterMessage();
  }  

Das Twitter-API stellt unter der Adresse http://api.twitter.com/statuses/update.xml die Operation zum Senden eines Tweets bereit. Die Nachricht steht in dem Parameter status, der in dem PostBody enthalten ist:

var postBodyParameter = new Dictionary
  {
    {"status", Uri.EscapeDataString(tbMessage.Text)}
  };  

Zunächst werden die bekannten OAuth-Parameter sowie der erhaltene oauth_token zusammengetragen (Listing 9).

Listing 9

// oauth_token für OAuth mit Werten vorbereiten
var oAuthParameter = new Dictionary
   {
     {"oauth_consumer_key", TwitterSettings.ConsumerKey},
     {"oauth_nonce", (new Random(DateTime.Now.Millisecond)).Next(100000, 9999999).ToString("0")},
     {"oauth_timestamp", (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds.ToString("0")},
     {"oauth_signature_method", "HMAC-SHA1"},
     {"oauth_version", "1.0"},
     {"oauth_token", TwitterSettings.Instance.AuthToken}
   };  

Damit die Anfrage als gültig akzeptiert wird, muss sie signiert werden. Die Signatur (unterschrieben) wird über alle Parameter , OAuth-Parameter und Nachrichtenparameter gebildet. Als Schlüssel werden die zwei Secrets zusammengefügt. Der Rest der Funktion ist wie bekannt (Listing 10).

Listing 10

// Zusammenführen und Sortieren der Parameter für Hash-Berechnung
var sortList = oAuthParameter.ToList().Union(postBodyParameter.ToList()).ToList();
sortList.Sort((a, b) => String.CompareOrdinal(a.Key, b.Key));
var sortedParameter = sortList.ToDictionary(pair => pair.Key, pair => pair.Value);

// Zeichenkette für die Berechnung des HASH-Wertes erzeugen
var signatureString = string.Format("POST&{0}&{1}",
     Uri.EscapeDataString("http://api.twitter.com/statuses/update.xml"),
     Uri.EscapeDataString(new QueryString(sortedParameter).ToString()));

// Schlüssel für Berechnung der Signatur vorbereiten
var hmacsha1 = new HMACSHA1();
var key = string.Format("{0}&{1}",
    Uri.EscapeDataString(TwitterSettings.ConsumerSecret),
    Uri.EscapeDataString(TwitterSettings.Instance.AuthSecret));
hmacsha1.Key = Encoding.UTF8.GetBytes(key);
// Berechnung und Hinzufügen der Signatur
var sig = Convert.ToBase64String(hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(signatureString)));
oAuthParameter.Add("oauth_signature", Uri.EscapeDataString(sig));  
Erweiterungen

Diese Anwendung dient vor allem der Darstellung des Prinzips der Verwendung von OAuth am Beispiel von Twitter. Weitere Schritte sollten sein, die Token aus den TwitterSettings zu sichern, sodass der Anwender sich nach dem Neustart der App nicht neu anmelden muss. Ferner können die Aufrufe des REST API in entsprechende Funktionen ausgelagert werden und weitere API-Funktionen von Twitter eingebunden werden.

Matthias Fischer ist freier Autor, Trainer, Berater und Entwickler für .NET-Technologie seit dem ersten Framework. Sein Spezialgebiet ist die Entwicklung mobiler Anwendungen für Windows Phone 7, Windows 8 sowie in HTML5. www.dotnetautor.de.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -