Je suis d'accord avec vous. L'open-source OAuth des cours de soutien disponibles .NET applications sont difficiles à comprendre, trop compliqué (nombre de méthodes sont exposées par DotNetOpenAuth?), mal conçu (regardez les méthodes avec 10 paramètres de la chaîne dans le OAuthBase.cs module de google le lien que vous avez fourni - il n'y a pas de gestion de l'état), ou de façon peu satisfaisante.
Il n'a pas besoin d'être compliqué.
Je ne suis pas un expert sur le protocole OAuth, mais j'ai produit un client OAuth gestionnaire de côté classe, que j'utilise avec succès avec Twitter et TwitPic. C'est relativement simple à utiliser. Il est open source et disponible ici: Oauth.cs
Pour l'examen, dans OAuth 1.0 a...plutôt drôle, il y a un nom spécial, et il ressemble à un "standard", mais autant que je sache, le seul service qui implémente "OAuth 1.0 a" est Twitter. Je suppose que c'est une norme assez. ok, de toute façon dans OAuth 1.0 a, la façon dont il fonctionne pour les applications de bureau est ceci:
Vous, le développeur de l'application, inscrire l'application et d'obtenir un "consommateur" et le "code secret". Sur Arstechnica, il y a un bien écrit, d'une analyse des raisons pour lesquelles ce modèle n'est pas le meilleur, mais comme ils le disent, c'est ce qu'il est.
-
Votre application s'exécute. La première fois qu'il fonctionne, il a besoin d'obtenir de l'utilisateur explicitement d'accorder l'agrément pour l'application de faire oauth authentifié RESTE demandes de Twitter et de sa sœur (services comme TwitPic). Pour ce faire, vous devez passer par un processus d'approbation, impliquant l'autorisation expresse de l'utilisateur. Cela se produit uniquement la première fois que l'application s'exécute. Comme ceci:
- demande un "jeton de demande". Aka jeton temporaire.
- pop une page web, en passant, que la demande de jeton de la requête en tant que param. Cette page web présente une INTERFACE utilisateur pour l'utilisateur, en demandant "voulez-vous accorder l'accès à cette application?"
- l'utilisateur se connecte à twitter page web, et accorde ou refuse l'accès.
- la réponse de la page html s'affiche. Si l'utilisateur a accès, il y a un code PIN affiché dans un délai de 48-pt de la police
- l'utilisateur doit maintenant couper/coller ce code dans un formulaire windows, puis cliquez sur "Suivant" ou quelque chose de similaire.
- l'application de bureau, puis un oauth demande authentifiée par un "jeton d'Accès". Un autre RESTE de la demande.
- l'application de bureau, reçoit le "jeton d'accès" et "accès secret".
Après l'approbation de la danse, de l'application de bureau peut simplement utiliser l'utilisateur "jeton d'accès" et "accès secret" (avec l'application spécifique de "consommateur" et le "code secret") à faire authentifié demandes au nom de l'utilisateur de Twitter. Ces n'ont pas d'échéance, même si l'utilisateur de-autorise l'application, ou si Twitter est pour une raison de-autorise votre application, ou si vous perdez votre jeton d'accès et/ou de secret, vous devez faire l'approbation de la danse à nouveau.
Si vous n'êtes pas intelligent, le flux d'INTERFACE utilisateur peut sorte de miroir de la multi-étape d'authentification OAuth flux de messages. Il ya une meilleure façon.
L'utilisation d'un contrôle WebBrowser, et ouvrir l'autoriser page web dans l'application de bureau. Lorsque l'utilisateur clique sur "Autoriser", saisir le texte de la réponse à partir de ce contrôle WebBrowser, extraire le code PIN automatiquement, puis obtenir les jetons d'accès. Vous envoyer 5 ou 6 requêtes HTTP, mais l'utilisateur doit voir qu'une seule Autoriser/Refuser le dialogue. Simple.
Comme ceci:
Si vous avez de l'INTERFACE utilisateur triées, le seul problème qui reste est de produire oauth signé demandes. Cette voyages jusqu'à beaucoup de gens parce que la oauth exigences de signature sont un peu particulier. C'est ce que l'simplifié OAuth Gestionnaire de classe.
Exemple de code pour demander un jeton:
var oauth = new OAuth.Manager();
// the URL to obtain a temporary "request token"
var rtUrl = "https://api.twitter.com/oauth/request_token";
oauth["consumer_key"] = MY_APP_SPECIFIC_KEY;
oauth["consumer_secret"] = MY_APP_SPECIFIC_SECRET;
oauth.AcquireRequestToken(rtUrl, "POST");
C'EST ÇA. Simple. Comme vous pouvez le voir dans le code, le chemin pour se rendre à oauth paramètres est par l'intermédiaire d'une chaîne à l'indexeur, quelque chose comme un dictionnaire. Le AcquireRequestToken méthode envoie un oauth demande signée à l'URL du service de subventions de demander des jetons, aka temporaire des jetons. Pour Twitter, cette URL est "https://api.twitter.com/oauth/request_token". Oauth spec dit que vous avez besoin pour emballer l'ensemble des paramètres d'authentification oauth (jeton, token_secret, nonce, timestamp, consumer_key, la version, et le rappel), d'une certaine manière (url-encodée, et rejoint par des esperluettes ( & ), et dans une lexicographiquement-de l'ordre de tri, de générer une signature sur ce résultat, puis emballer ces mêmes paramètres avec la signature, stockée dans la nouvelle oauth_signature paramètre, d'une manière différente (rejoint par des virgules). OAuth gestionnaire de classe le fait pour vous automatiquement. Il génère des nonces et les horodatages et les versions et les signatures automatiquement votre application n'a pas besoin de soins ou d'être conscient de ce genre de choses. Il suffit de régler le oauth les valeurs de paramètre et de faire un simple appel de méthode. le gestionnaire de classe envoie la demande et analyse de la réponse pour vous.
Ok, alors quoi? Une fois que vous obtenir le jeton de demande, vous pop le navigateur web de l'INTERFACE utilisateur dans laquelle l'utilisateur est explicitement d'accorder l'approbation. Si vous le faites correctement, vous aurez la pop dans un navigateur intégré. Pour Twitter, l'URL de ce qui est "https://api.twitter.com/oauth/authorize?oauth_token=" avec le oauth_token ajouté. Le faire dans le code comme ceci:
var url = SERVICE_SPECIFIC_AUTHORIZE_URL_STUB + oauth["token"];
webBrowser1.Url = new Uri(url);
(Si vous faisiez cela dans un navigateur externe que vous souhaitez utiliser System.Diagnostics.Process.Start(url)
.)
Paramètre de l'Url de propriété entraîne le contrôle WebBrowser pour naviguer jusqu'à la page automatiquement.
Lorsque l'utilisateur clique sur le bouton "Autoriser" une nouvelle page va être chargé. C'est un formulaire HTML et il fonctionne de la même comme dans un navigateur complet. Dans votre code, enregistrer un gestionnaire pour l'DocumentedCompleted cas de contrôle WebBrowser, et dans ce gestionnaire, saisir le code pin:
var divMarker = "<div id=\"oauth_pin\">"; // the div for twitter's oauth pin
var index = webBrowser1.DocumentText.LastIndexOf(divMarker) + divMarker.Length;
var snip = web1.DocumentText.Substring(index);
var pin = RE.Regex.Replace(snip,"(?s)[^0-9]*([0-9]+).*", "$1").Trim();
C'est un peu de HTML capture d'écran.
Après avoir saisi le code pin, vous n'avez pas besoin du navigateur web, donc:
webBrowser1.Visible = false; // all done with the web UI
...et vous pouvez en Disposer ().
La prochaine étape consiste à obtenir le jeton d'accès, par l'envoi d'un autre message HTTP avec code pin. C'est un autre signé le protocole oauth appel, construit avec oauth de commande et de mise en forme que j'ai décrit ci-dessus. Mais encore une fois c'est vraiment simple avec OAuth.Le gestionnaire de classe:
oauth.AcquireAccessToken(URL_ACCESS_TOKEN,
"POST",
pin);
Pour Twitter, l'URL est "https://api.twitter.com/oauth/access_token".
Vous avez maintenant accès à jetons, et vous pouvez les utiliser dans signé des requêtes HTTP. Comme ceci:
var authzHeader = oauth.GenerateAuthzHeader(url, "POST");
...où est - url
est la ressource de point de terminaison. Pour mettre à jour le statut de l'utilisateur, il serait "http://api.twitter.com/1/statuses/update.xml?status=Hello".
Ensuite, réglez cette chaîne dans l'en-Tête HTTP nommée Autorisation.
Pour interagir avec les services de tiers, comme TwitPic, vous devez construire un légèrement différent OAuth en-tête, comme ceci:
var authzHeader = oauth.GenerateCredsHeader(URL_VERIFY_CREDS,
"GET",
AUTHENTICATION_REALM);
Pour Twitter, les valeurs pour le vérifier creds url et le royaume "https://api.twitter.com/1/account/verify_credentials.json" et "http://api.twitter.com/", respectivement.
...et mettre que l'autorisation de la chaîne dans un en-tête HTTP appelée X-Vérifiez-les informations d'Identification de l'Autorisation. Ensuite, envoyez-le à votre service, comme TwitPic, ainsi que tout ce que demande que vous envoyez.
C'est tout.
Tous ensemble, le code de mise à jour de statut twitter pourrait être quelque chose comme ceci:
// the URL to obtain a temporary "request token"
var rtUrl = "https://api.twitter.com/oauth/request_token";
var oauth = new OAuth.Manager();
// The consumer_{key,secret} are obtained via registration
oauth["consumer_key"] = "~~~CONSUMER_KEY~~~~";
oauth["consumer_secret"] = "~~~CONSUMER_SECRET~~~";
oauth.AcquireRequestToken(rtUrl, "POST");
var authzUrl = "https://api.twitter.com/oauth/authorize?oauth_token=" + oauth["token"];
// here, should use a WebBrowser control.
System.Diagnostics.Process.Start(authzUrl); // example only!
// instruct the user to type in the PIN from that browser window
var pin = "...";
var atUrl = "https://api.twitter.com/oauth/access_token";
oauth.AcquireAccessToken(atUrl, "POST", pin);
// now, update twitter status using that access token
var appUrl = "http://api.twitter.com/1/statuses/update.xml?status=Hello";
var authzHeader = oauth.GenerateAuthzHeader(appUrl, "POST");
var request = (HttpWebRequest)WebRequest.Create(appUrl);
request.Method = "POST";
request.PreAuthenticate = true;
request.AllowWriteStreamBuffering = true;
request.Headers.Add("Authorization", authzHeader);
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
MessageBox.Show("There's been a problem trying to tweet:" +
Environment.NewLine +
response.StatusDescription);
}
OAuth 1.0 est un peu compliqué sous les couvertures, mais son utilisation n'a pas besoin d'être.
Le Protocole OAuth.Le gestionnaire gère la génération de sortants oauth demandes, et la réception et le traitement de l'authentification oauth contenu dans les réponses. Lorsque le Request_token demande vous donne un oauth_token, votre application n'a pas besoin de le stocker. Le Protocole Oauth.Le gestionnaire est assez intelligent pour le faire automatiquement. De même, lorsque l'access_token demande récupère un jeton d'accès et de secret, vous n'avez pas besoin de stocker explicitement. Le Protocole OAuth.Manager traite que de l'état pour vous.
Dans les passages suivants, lorsque vous avez déjà le jeton d'accès et de secret, vous pouvez instancier la OAuth.Gestionnaire comme ceci:
var oauth = new OAuth.Manager();
oauth["consumer_key"] = CONSUMER_KEY;
oauth["consumer_secret"] = CONSUMER_SECRET;
oauth["token"] = your_stored_access_token;
oauth["token_secret"] = your_stored_access_secret;
...et puis de générer l'autorisation des en-têtes ci-dessus.
// now, update twitter status using that access token
var appUrl = "http://api.twitter.com/1/statuses/update.xml?status=Hello";
var authzHeader = oauth.GenerateAuthzHeader(appUrl, "POST");
var request = (HttpWebRequest)WebRequest.Create(appUrl);
request.Method = "POST";
request.PreAuthenticate = true;
request.AllowWriteStreamBuffering = true;
request.Headers.Add("Authorization", authzHeader);
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
MessageBox.Show("There's been a problem trying to tweet:" +
Environment.NewLine +
response.StatusDescription);
}
Vous pouvez télécharger une DLL contenant les OAuth.Le gestionnaire de classe ici. Il y a également un fichier d'aide dans le téléchargement. Ou vous pouvez afficher le fichier d'aide en ligne.
Voir un exemple d'un Formulaire Windows qui utilise ce manager ici.
EXEMPLE DE TRAVAIL
Télécharger un exemple de travail d'un outil de ligne de commande qui utilise la classe et de la technique décrite ici: