Joh*_*ohn 102 .net oauth mendeley
我正在尝试创建一个基于.NET的客户端应用程序(在WPF中 - 虽然目前我只是将其作为控制台应用程序)与一个支持OAuth的应用程序集成,特别是Mendeley(http:// dev .mendeley.com),显然使用三足OAuth.
这是我第一次使用OAuth,开始使用它时遇到了很多困难.我发现了几个.NET OAuth库或帮助程序,但它们似乎比我想象的要复杂得多.我想要做的就是能够向Mendeley API发出REST请求并获得回复!
到目前为止,我已经尝试过:
第一个(DotNetOpenAuth)似乎可以做我需要的,如果我花了几个小时试图弄清楚如何.我可以说,第二个和第三个不支持Mendeley发回的验证码 - 虽然我可能错了:)
我从Mendeley获得了消费者密钥和秘密,并且通过DotNetOpenAuth,我设法通过Mendeley页面启动了一个浏览器,为用户提供了进入应用程序的验证码.然而,在这一点上,我迷路了,无法弄清楚如何合理地将其提供给应用程序.
我非常愿意承认我不知道从哪里开始(虽然看起来有一个相当陡峭的学习曲线) - 如果有人能指出我正确的方向我会很感激!
Che*_*eso 178
我同意你的看法..NET应用程序可用的开源OAuth支持类很难理解,过于复杂(DotNetOpenAuth公开了多少方法?),设计不合理(在Google的OAuthBase.cs模块中查看10个字符串参数的方法)你提供的链接 - 根本没有国家管理),或者不满意.
它不需要这么复杂.
我不是OAuth的专家,但我已经创建了一个OAuth客户端管理器类,我成功地使用了Twitter和TwitPic.它使用起来相对简单.它是开源的,可以在这里找到:Oauth.cs
对于审查,在OAuth 1.0a ...有点搞笑,有一个特殊的名称,它看起来像一个"标准",但据我所知,实现"OAuth 1.0a"的唯一服务是Twitter.我想这就是标准不够.好吧,无论如何在OAuth 1.0a中,它适用于桌面应用程序的方式是这样的:
您,该应用程序的开发人员,注册该应用程序并获得"消费者密钥"和"消费者秘密".在Arstechnica上,有一个很好的书面分析,为什么这个模型不是最好的,但正如他们所说,它就是它的本质.
你的应用运行.第一次运行时,它需要让用户明确授予应用程序批准,以便对Twitter及其姐妹服务(如TwitPic)进行经过oauth身份验证的REST请求.为此,您必须经过审批流程,并获得用户的明确批准.这仅在应用程序第一次运行时发生.像这样:
批准舞后,桌面应用程序可以只使用用户特定的"访问令牌"和"访问机密"(以及特定于应用程序的"消费者密钥"和"消费者密钥")代表用户执行经过身份验证的请求到Twitter.这些不会过期,但如果用户取消授权应用程序,或者Twitter由于某种原因取消授权您的应用程序,或者如果您丢失了访问令牌和/或秘密,则需要再次进行审批舞蹈.
如果您不聪明,UI流可以对多步OAuth消息流进行镜像.有一个更好的办法.
使用WebBrowser控件,并在桌面应用程序中打开授权网页.当用户单击"允许"时,从该WebBrowser控件中获取响应文本,自动提取PIN,然后获取访问令牌.您发送5或6个HTTP请求,但用户只需要看到一个允许/拒绝对话框.简单.
像这样:

如果您对UI进行了排序,那么剩下的唯一挑战就是生成oeuth签名的请求.这会使很多人绊倒,因为oauth签名要求有点特别.这就是简化的OAuth Manager类的功能.
请求令牌的示例代码:
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");
Run Code Online (Sandbox Code Playgroud)
就是这样.简单.从代码中可以看出,获取oauth参数的方法是通过基于字符串的索引器,类似于字典.AcquireRequestToken方法将oauth签名的请求发送到授予请求令牌(即临时令牌)的服务的URL.对于Twitter,此URL为" https://api.twitter.com/oauth/request_token ".oauth规范说你需要以某种方式(url编码并通过&符号加入)收集oauth参数集(token,token_secret,nonce,timestamp,consumer_key,version和callback),并按字典顺序 - 排序顺序,在该结果上生成签名,然后以不同的方式(以逗号连接)将这些相同的参数与存储在新oauth_signature参数中的签名一起打包. OAuth管理器类会自动为您执行此操作. 它会自动生成随机数和时间戳以及版本和签名 - 您的应用程序无需关心或了解这些内容.只需设置oauth参数值并进行简单的方法调用.manager类发送请求并为您解析响应.
好的,那又怎样?获得请求令牌后,您将弹出用户将明确授予批准的Web浏览器UI.如果你做得对,你会在嵌入式浏览器中弹出它.对于Twitter,其URL为" https://api.twitter.com/oauth/authorize?oauth_token= ",并附加oauth_token.在代码中执行此操作:
var url = SERVICE_SPECIFIC_AUTHORIZE_URL_STUB + oauth["token"];
webBrowser1.Url = new Uri(url);
Run Code Online (Sandbox Code Playgroud)
(如果您在外部浏览器中执行此操作,则使用System.Diagnostics.Process.Start(url).)
设置Url属性会导致WebBrowser控件自动导航到该页面.
当用户单击"允许"按钮时,将加载新页面.它是一个HTML表单,它与完整浏览器中的工作方式相同.在您的代码中,为WebBrowser控件的DocumentedCompleted事件注册一个处理程序,并在该处理程序中,获取该引脚:
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();
Run Code Online (Sandbox Code Playgroud)
这是一些HTML屏幕抓取.
抓住引脚后,您不再需要Web浏览器,因此:
webBrowser1.Visible = false; // all done with the web UI
Run Code Online (Sandbox Code Playgroud)
...你可能也想在它上面调用Dispose().
下一步是通过发送另一个HTTP消息以及该引脚来获取访问令牌.这是另一个签名的oauth调用,使用上面描述的oauth排序和格式构建.但是再次使用OAuth.Manager类非常简单:
oauth.AcquireAccessToken(URL_ACCESS_TOKEN,
"POST",
pin);
Run Code Online (Sandbox Code Playgroud)
对于Twitter,该URL是" https://api.twitter.com/oauth/access_token ".
现在您可以访问令牌,并且可以在签名的HTTP请求中使用它们.像这样:
var authzHeader = oauth.GenerateAuthzHeader(url, "POST");
Run Code Online (Sandbox Code Playgroud)
... url资源端点在哪里.要更新用户的状态,它将是" http://api.twitter.com/1/statuses/update.xml?status=Hello ".
然后将该字符串设置为名为Authorization的HTTP标头.
要与TwitPic等第三方服务进行交互,您需要构建一个稍微不同的 OAuth标头,如下所示:
var authzHeader = oauth.GenerateCredsHeader(URL_VERIFY_CREDS,
"GET",
AUTHENTICATION_REALM);
Run Code Online (Sandbox Code Playgroud)
对于Twitter,验证信用URL和域的值分别为" https://api.twitter.com/1/account/verify_credentials.json "和" http://api.twitter.com/ ".
...并将该授权字符串放在名为X-Verify-Credentials-Authorization的HTTP标头中.然后将其发送到您的服务,如TwitPic,以及您发送的任何请求.
而已.
总之,更新Twitter状态的代码可能是这样的:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
OAuth 1.0a有点复杂,但不一定要使用它.OAuth.Manager处理传出的oauth请求的生成,以及响应中oauth内容的接收和处理.当Request_token请求为您提供oauth_token时,您的应用不需要存储它.Oauth.Manager足够聪明,可以自动完成.同样,当access_token请求返回访问令牌和秘密时,您不需要显式存储它们.OAuth.Manager为您处理该状态.
在后续运行中,当您已经拥有访问令牌和机密时,可以像这样实例化OAuth.Manager:
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;
Run Code Online (Sandbox Code Playgroud)
...然后生成如上所述的授权标头.
// 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);
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处下载包含OAuth.Manager类的DLL.该下载中还有一个帮助文件.或者您可以在线查看帮助文件.
请参阅此处使用此管理器的Windows窗体示例.
| 归档时间: |
|
| 查看次数: |
73224 次 |
| 最近记录: |