OAuth mit der Überprüfung .NET
Ich versuche zu erstellen .NET-basierte client-Anwendung (WPF - obwohl für die Zeit Wesen, das ich bin, es einfach zu tun als console-app) zu integrieren, mit einer OAuth-aktivierten Anwendung, speziell Mendeley (http://dev.mendeley.com), die offenbar nutzt 3-legged OAuth.
Dies ist mein erstes mal mit OAuth, und ich habe eine Menge von Schwierigkeiten, angefangen mit ihm. Ich habe aus mehreren Gründen .NET-OAuth-Bibliotheken oder Helfer, aber Sie scheinen komplizierter als ich denke, dass ich brauche. Alles was ich tun möchte, ist in der Lage sein zur Ausgabe von REST-Anfragen an den Mendeley-API und erhalten Sie Antworten zurück!
So weit, dass ich versucht habe:
- DotNetOpenAuth
- http://github.com/bittercoder/DevDefined.OAuth
- http://oauth.googlecode.com/svn/code/csharp/
Den ersten (DotNetOpenAuth) scheint, wie es vielleicht tun könnte, was ich brauchte, wenn ich verbrachte Stunden und Stunden versucht, herauszufinden, wie. Die zweite und Dritte, soweit ich das beurteilen kann, keine Unterstützung für die überprüfung codes, die von Mendeley ist die Rücksendung-obwohl ich könnte falsch sein darüber 🙂
Ich habe einen consumer-key und-secret von Mendeley, und mit DotNetOpenAuth ich es geschafft, ein browser gestartet, mit der Mendeley-Seite mit einem Bestätigungs-code für die Eingabe in die Anwendung. Jedoch, an diesem Punkt hab ich verloren und konnte nicht herausfinden, wie man vernünftig liefern, zurück zur Anwendung.
Ich bin sehr bereit zuzugeben, dass ich keine Ahnung habe wo, mit diesem zu starten (obwohl es scheint, wie es ist eine ziemlich steile Lernkurve) - ob jemand kann mich in die richtige Richtung, ich würde es zu schätzen wissen!
InformationsquelleAutor John | 2010-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stimme ich mit Ihnen überein. Die open-source-OAuth-Unterstützung von Klassen zur Verfügung .NET apps sind schwer zu verstehen, zu kompliziert (wie viele Methoden ausgesetzt sind, die von DotNetOpenAuth?), schlecht konzipiert (Blick auf die Methoden, mit 10-string-Parameter in die OAuthBase.cs-Modul aus, dass google-link, den Sie zur Verfügung gestellt - es gibt keine staatlichen Verwaltung überhaupt), oder sonst unbefriedigend.
Es muss nicht sein das zu kompliziert.
Ich bin kein Experte auf OAuth, aber ich habe produziert eine OAuth-client-side-manager-Klasse, welche ich erfolgreich mit Twitter und TwitPic. Es ist relativ einfach zu bedienen. Es ist open-source und hier erhältlich: Oauth.cs
Für die überprüfung, in OAuth 1.0 a...irgendwie komisch, es ist ein besonderer name und es sieht aus wie ein "standard", aber soweit ich weiß ist der einzige Dienst, die "OAuth 1.0 a" ist Twitter. Ich denke, das ist standard genug. ok, jedenfalls in OAuth 1.0 a, die Art, wie es funktioniert für desktop-apps ist diese:
Ihnen, dem Entwickler der app, registrieren Sie die app und erhalten Sie einen "consumer key" und "consumer secret". Auf Arstechnica gibt es eine gut geschriebene Analyse, warum dieses Modell nicht das beste ist, aber wie Sie sagen, es ist, was es ist.
Ihre app ausgeführt wird. Das erste mal, es läuft, es muss dem Benutzer explizit zu erteilen, die Genehmigung für die app zu machen, oauth-authentifizierte REST-Anfragen auf Twitter und deren Schwester-Dienstleistungen (wie TwitPic). Um dies zu tun müssen Sie gehen durch einen Genehmigungs-Prozess, der mit der ausdrücklichen Genehmigung durch den Nutzer. Dies geschieht nur beim ersten mal die app ausgeführt wird. Wie diese:
Nach der Genehmigung Tanz, der desktop-app können Sie nur verwenden Sie den Benutzer-spezifischen "access token" und "access-Geheimnis" (mit dem app-spezifische "consumer-key" und "consumer secret") zu tun authentifizierte Anfragen im Namen des Benutzers auf Twitter. Diese verfallen nicht, wenn der user de-autorisiert die app, oder wenn Twitter für einige Grund de-autorisiert, Ihre app, oder wenn Sie verlieren Ihre access-token und/oder geheim, Sie würde tun müssen, um die Genehmigung wieder zu tanzen.
Wenn du bist nicht klug, UI-flow können eine Art Spiegel der multi-Schritt-OAuth-Nachrichtenübermittlung. Es gibt einen besseren Weg.
Ein WebBrowser-Steuerelement verwenden, und öffnen Sie das autorisieren web-Seite in der desktop-app. Wenn der Benutzer klickt auf "Erlauben", schnappen Sie sich der Antwort-text aus, das WebBrowser-Steuerelement, extrahieren Sie die PIN automatisch, dann Holen Sie sich den access Token. Sie senden 5 oder 6 HTTP-Anfragen, sondern die Bedürfnisse der Benutzer zu sehen, nur eine einzige Erlauben/Verweigern dialog. Einfach.
Wie diese:
Wenn Sie haben die Benutzeroberfläche sortiert, die einzige Herausforderung, die bleibt, ist, zu produzieren oauth signierten Anfragen. Diese Reisen viele Menschen, weil die oauth-Unterzeichnung Anforderungen sind eine Art der besonderen. Das ist es, was die vereinfachte OAuth-Manager-Klasse.
Beispiel-code zum anfordern eines Tokens:
DAS IST ES. Einfach. Wie Sie sehen können aus dem code, den Weg zu oauth-Parameter wird über einen string-basierte indexer, so etwas wie ein Wörterbuch. Die AcquireRequestToken Methode sendet eine oauth signierten request an die URL des service gewährt, dass Anfrage-Token, aka temporäre Token. Für Twitter, diese URL ist "https://api.twitter.com/oauth/request_token". Der oauth-Spezifikation sagt, dass Sie brauchen, um zu packen bis der Satz von oauth-Parameter (token, token_secret, nonce, timestamp, consumer_key, version und Rückruf) in einer bestimmten Weise (url-codiert und trat durch kaufmännische und-Zeichen), und in lexikographisch sortierter Reihenfolge, erstellen Sie eine Signatur auf das Ergebnis, dann pack die gleichen Parameter zusammen mit der Signatur, gespeichert in der neuen oauth_signature Parameters, in einer anderen Weise (kam durch Kommas getrennt). Die OAuth-manager-Klasse tut dies für Sie automatisch. Es erzeugt nonces und timestamps und Versionen und Signaturen automatisch - app braucht nicht zu sorgen oder sich bewusst sein, das Zeug. Setzen Sie einfach die oauth-parameter-Werte und machen eine einfache Methode nennen. die manager-Klasse sendet den request und parst die Antwort für Sie.
Ok, was dann? Sobald Sie den Anfrage-token, pop Sie die web-browser-Benutzeroberfläche, in dem der Benutzer explizit seine Genehmigung erteilen. Wenn Sie es richtig machen, werden Sie pop diese in einem eingebetteten browser. Für Twitter, die URL dazu lautet "https://api.twitter.com/oauth/authorize?oauth_token=" mit dem oauth_token angehängt. Tun Sie dies im code etwa so:
(Wenn Sie waren, dies zu tun in einem externen browser, die Sie verwenden würden
System.Diagnostics.Process.Start(url)
.)Festlegen der Url-Eigenschaft bewirkt, dass das WebBrowser-Steuerelement für die Navigation zu dieser Seite automatisch.
Wenn der Benutzer klickt auf den "Erlauben" - Schaltfläche wird eine neue Seite geladen wird. Es ist ein HTML-Formular und es funktioniert genauso wie in einem vollen browser. In Ihrem code, registrieren Sie einen handler für die DocumentedCompleted Ereignis des WebBrowser-Steuerelements, und in diesem handler, greifen Sie die pin:
Dass ein wenig HTML screen scraping.
Nachdem er die pin benötigen Sie keinen web-browser mehr, also:
...und Sie könnten wollen, rufen Sie Dispose() auf Sie als gut.
Der nächste Schritt ist immer der access-token, durch das senden einer anderen HTTP-Nachricht zusammen mit einer pin. Dies ist ein weiterer unterzeichnet oauth nennen, konstruiert, mit der oauth-Bestellung und-Formatierung die ich oben beschrieben habe. Aber nochmal, das ist wirklich einfach, mit dem OAuth.Manager-Klasse:
Twitter, die URL ist "https://api.twitter.com/oauth/access_token".
Nun haben Sie Zugriff Token, und Sie können Sie in signierte HTTP-Anfragen. Wie diese:
...wo
url
ist die Ressource Endpunkt. Zum update-status des Benutzers, es wäre "http://api.twitter.com/1/statuses/update.xml?status=Hello".Dann festgelegt, dass der string in dem HTTP-Header namens Genehmigung.
Interaktion mit Drittanbieter-Dienste, wie TwitPic, die Sie benötigen, zu konstruieren, ein etwas anders OAuth-header, so wie hier:
Twitter, die Werte für das überprüfen creds url und Reich sind " https://api.twitter.com/1/account/verify_credentials.json " und "http://api.twitter.com/" ersetzt.
...und setzen , dass authorization-string im HTTP-header namens " X-Prüfen-Anmeldeinformationen-Genehmigung. Dann senden Sie, die zu Ihrem Dienst, wie TwitPic, zusammen mit dem, was verlangen Sie versenden.
Das ist es.
Alle zusammen, ist der code für twitter-status aktualisieren könnte so etwas wie dieses:
OAuth 1.0 a ist eine Art von komplizierte unter der Decke, aber benutze es nicht.
Die OAuth.Manager übernimmt die Generierung der ausgehenden oauth-Anfragen, und die Aufnahme und Verarbeitung von oauth Inhalt in den Antworten. Wenn die Request_token Anfrage gibt Ihnen einen oauth_token, Ihre app nicht brauchen, um es zu speichern. Die Oauth.Manager ist smart genug, das zu tun, automatisch. Ebenso, wenn die access_token Anfrage erhält wieder einen access-token und-secret, brauchen Sie nicht explizit zu speichern diese. Die OAuth.Manager verarbeitet, dass der Staat für Sie.
Im nachfolgenden ausgeführt wird, wenn Sie bereits die Zugangs-token und secret, die Sie instanziieren können die OAuth.Manager wie dieser:
...und dann erzeugen Sie einen authorization-Header wie oben.
Können Sie herunterladen eine DLL mit der OAuth.Manager-Klasse hier. Es gibt auch eine Hilfedatei im download. Oder Sie können anzeigen der Hilfedatei online.
Sehen Sie ein Beispiel einer Windows-Formular mit diesem manager hier.
BEISPIEL ARBEITEN
Download ein funktionierendes Beispiel von einer Befehl-Linie Werkzeug, die diese Klasse verwendet und die Technik ist hier beschrieben:
Hi Cheeso, vielen Dank für deinen code und deine ausführliche Erklärung. Sie war eine tolle und doch einfache Lösung. Allerdings werden Sie wollen, um eine kleine änderung in Ihrer GetSignatureBase Methode zur Unterstützung von nicht "oob" - Lösungen. Für nicht "oob" ist, müssen Sie die URL-codieren, den Rückruf, so dass Sie wollen, fügen Sie so etwas wie dies, wenn Sie Durchlaufen._params: if (p1.Key == "callback") {p.Add("oauth_" + p1.Schlüssel, UrlEncode(p1.Wert));continue;}
+1 Danke für die ausführliche Antwort. Eine Sache, tho: ich bin immer eine Ausnahme in Ihrer Klasse verwenden, wenn ich "oauth_callback"; es sieht aus wie eine Valide option, aber der code nicht wie es (ArgumentException).
Ist die PIN-Prüfung kann einmal durchgeführt werden? In meine eigene Umsetzung fand ich, dass ich überprüfen kann, mit der richtigen PIN-einst. Wenn ich versuche mit der falschen pin und versuchen Sie es dann mit der richtigen PIN wird es nicht funktionieren.
Dies funktioniert nicht für OAuth 2.0. Diese Klasse ist für OAuth 1.0 a. OAuth2.0 ist wesentlich einfacher zu verwenden, da es keine Unterzeichnung und lexikographische Sortierung der verschiedenen Parameter. So dass Sie wahrscheinlich nicht brauchen eine externe Klasse zu tun, OAuth 2.0, oder... wenn Sie tun, benötigen Sie eine externe Klasse, es ist alles viel viel einfacher als diese.
InformationsquelleAutor