Twitter-Integration auf dem Windows Phone 7.5

Zwitschern auf Mango (Teil 2)
Kommentare

Windows Developer

Der Artikel „Zwitschern auf Mango“ von Matthias Fischer ist erstmalig erschienen im Windows Developer 9.2012
RequestToken anfordern
Das Twitter-API stellt dafür den URI http://api.twitter.com/oauth/request_token

Windows Developer

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

RequestToken anfordern

Das Twitter-API stellt dafür den URI http://api.twitter.com/oauth/request_token bereit. Für das OAuth-Verfahren müssen zunächst alle für diesen Aufruf erforderlichen OAuth-Parameter gesammelt werden. Für die Anforderung des RequestToken sind das die Parameter in Listing 2.

Listing 2

// AutorisierungsHeader 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"}
  };  

Der ConsumerKey wird von Twitter für diese App bereitgestellt, Nonce wird mit einem Zufallswert gefüllt. Der TimeStamp ist der Zeitpunkt des Zugriffs in Sekunden seit dem 1.1.1970. Die Signature_Method gibt die Methode an, nach der die Signatur berechnet wird. Version von OAuth ist im Beispiel immer 1.0.

Im nächsten Schritt wird die Berechnung des Hash-Werts vorbereitet. Der Hash-Wert wird die Übertragung digital signieren, wie eine Unterschrift, mit deren Hilfe später auf dem Server die Korrektheit der Nachricht geprüft werden kann. Dazu sind alle Parameter nach ihrem jeweiligen Schlüssel alphabetisch zu sortieren (Listing 3).

Listing 3

// Sortieren der Parameter für HashBerechnung
var sortList = oAuthParameter.ToList();
sortList.Sort((a, b) => String.CompareOrdinal(a.Key, b.Key));
var sortedParameter = sortList.ToDictionary(pair => pair.Key, pair => pair.Value);  

Um etwaigen Zugriffsmanipulationen an dem HttpVerb, der Adresse, der Methode oder den Parametern vorzubeugen, werden alle diese Informationen mithilfe des „&“-Zeichens zu einer Zeichenkette zusammengefügt (Listing 4).

Listing 4

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

Der Schlüssel (Key) setzt sich aus dem CustomerSecret und des AccessSecret zusammen. Da zu diesem Zeitpunkt noch kein AccessSecret vorliegt, bleibt das Feld dafür erst einmal leer. Nach der Berechnung wird der Parameter oauth_signatur zu den OAuth-Parametern hinzugefügt, wie in Listing 5 zu sehen.

Listing 5

// Schlüssel für Berechunng der Signatur zusammensetzen
var hmacsha1 = new HMACSHA1();
var key = string.Format("{0}&{1}", Uri.EscapeDataString(TwitterSettings.ConsumerSecret),"");
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));  

Die Übertragung erfolgt mithilfe eines WebRequest-Objekts. OAuth gibt nicht vor, ob eine Anfrage als POST oder GET gestellt werden muss. Im Beispiel soll die Anfrage als POST in Form eines „application/x-www-form-urlencoded“-Formulars gesendet werden. Um eine komprimierte Antwort zu erhalten, wird der Header Accept-Encoding auf gzip gesetzt. Die OAuth-Parameter werden in dem Autorisierungs-Header übertragen. Eine Hilfsfunktion formatiert die Zeichenkette. Da keine weiteren Parameter zu übertragen sind, kann die Antwort direkt mithilfe der Funktion BeginGetResponse asynchron ausgelesen werden (Listing 6). Auf dem Windows Phone erfolgen alle Aufrufe asynchron.

Listing 6

// Anfrage erstellen
var request = WebRequest.CreateHttp("http://api.twitter.com/oauth/request_token");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Accept-Encoding"] = "gzip";
request.Headers[HttpRequestHeader.Authorization] = QueryString.OAuthHeader(oAuthParameter);

// Antwort asynchron auslesen
request.BeginGetResponse(result => {
   try {
     var req = result.AsyncState as HttpWebRequest;
     using (var resp = req.EndGetResponse(result))
     using (var strm = new GZipStream(resp.GetResponseStream(), CompressionMode.Decompress))
     using (var reader = new StreamReader(strm)) {
       var responseText = reader.ReadLine();
        
       // Auslesen der AnforderungToken
       var qs = new QueryString(responseText);
       TwitterSettings.Instance.RequestToken = qs["oauth_token"];
       TwitterSettings.Instance.RequestSecret = qs["oauth_token_secret"];
       
       // 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;
        }
        Dispatcher.BeginInvoke(() => browser.Navigate(new Uri(authorizeUrl)));
      }
    } catch (Exception ex) {
      Dispatcher.BeginInvoke(() => MessageBox.Show("Der Anforderungstoken kann nicht empfangen werden."));
    }
  }, request);  

Innerhalb der asynchronen Empfangsfunktion wird zunächst der Datenstrom in einen GZipStream konvertiert, da die Antwort des Servers zunächst entpackt werden muss. In der ersten Zeile der Antwort stehen die Felder oauth_token und oauth_token_secret. Sie stellen die RequestToken bereit, mit deren Hilfe der URL für das Login zusammengesetzt werden kann.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -