原理图
第三方OAuth库
由于当中有一个签名的字段,需要实现一些比较复杂的操作。所以使用了danielcrenna的OAuth的库。下载地址https://github.com/danielcrenna/oauth
他里面的实例好像有点问题,好在库本身是可以使用的。而且非常方便。
代码
因为我是本地的程序所以我需要使用一个WebBrowser控件来完成认证授权的过程,另外也是因为是本地程序的原因我的回调地址就设置了一个localHost,这个回调地址必须有,不然会出现401错误,而且之后需要通过这个回调地址获取Verifier.这个回调地址,不一定是要可以访问的。
;
;
;
;
;
private String RequestToken;
private String RequestTokenSecret;
private String Verifier;
9:
string Token;
long Expires;
12:
object sender, RoutedEventArgs e)
14: {
15: RequesCredentials();
//使用webBrowser,导航到授权的网站
+
18: RequestToken);
19: }
20:
//获取RequestToken和RequestTokenSecret
void RequesCredentials()
23: {
//CallbackUrl是一定要设置的
25: OAuthRequest client = OAuthRequest.ForRequestToken(ConsumerKey,
26: ConsumerSecret);
27: client.RequestUrl = RequestURI;
28: client.CallbackUrl = CallbackURI;
29:
30: String auth = client.GetAuthorizationQuery();
+ auth;
32: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
33:
//获取请求结果
35: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
new StreamReader(response.GetResponseStream());
37: String result = reader.ReadToEnd();
38: reader.Close();
39: response.Close();
40:
//从结果中提取出RequestToken和RequestTokenSecret
'=')[1];
'=')[1];
44: }
45:
//针对授权的结果的Verifier
object sender, NavigatingCancelEventArgs e)
48: {
))
50: {
'=')).ToDictionary(s => s.First(), s => s.Last());
))
53: {
return;
55: }
];
//获取最终的Token
58: AccessCredentials();
59:
//显示结果
this.textBlock.Text =
,
63: Token, Expires);
//进行退出处理
this.webBrowser1.Visibility = Visibility.Hidden;
66: }
67: }
68:
//获取访问所需的Token Expires
void AccessCredentials()
71: {
72: OAuthRequest Client = OAuthRequest.ForAccessToken(ConsumerKey,
73: ConsumerSecret,
74: RequestToken,
75: RequestTokenSecret,
76: Verifier);
77: Client.RequestUrl = RequestURI;
78:
79: String auth = Client.GetAuthorizationQuery();
+ auth;
81: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
82:
83: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
new StreamReader(response.GetResponseStream());
85: String result = reader.ReadToEnd();
86: reader.Close();
87: response.Close();
88:
'=')).ToDictionary(s => s.First(), s => s.Last());
];
];
92:
93: Token = HttpUtility.UrlDecode(deToken);
94: Expires = Convert.ToInt64(expiresStr);
95: }