2012-12-03 34 views
3

我已经搜索了高和低的答案这个问题。基本上,我创建了一个C#应用程序(在它的第一个化身中)将使用OAuth 1.0a的Projectplace API进行身份验证。目前,它返回oauth_verifier到地址栏,但是当我使用var response = request.GetResponse();方法,它返回oauth_tokenoauth token_secret我发送,摆在首位的授权的一部分。从回调中获取oauth_verifier

也许我误解这个过程应该是在上班的路上,但我读过的每一个答案在那里,没有人可以解决这个问题。在回调URL加载后,在认证页面上输入我的用户名和密码之后,您是否必须或有可能从地址栏(或可以获取的任何地方)提取验证码?

我相信OAuth1.0a要求的验证码来获取访问令牌,我不能找到一个简单的方法来拉动的验证码。

我真的很感激任何帮助,它的驾驶我坚果!

更新日期03.12.12

感谢您的回复!

从本质上讲,我是客户端尝试以下发送此初始请求后检索从OAuth的提供商oauth_verifier,我的下一步就是授权然后检索验证。我尝试以下,希望如你所说,像在深水的一端在这里:)游泳

//Generate string for initiation request. 
requestUri.AppendFormat("?oauth_consumer_key={0}&", consumerKey); 
requestUri.AppendFormat("oauth_nonce={0}&", nonce); 
requestUri.AppendFormat("oauth_timestamp={0}&", timeStamp); 
requestUri.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); 
requestUri.AppendFormat("oauth_version={0}&", "1.0"); 
requestUri.AppendFormat("oauth_signature={0}", signature); 
var request = (HttpWebRequest)WebRequest.Create(new Uri(requestUri.ToString())); 
request.Method = WebRequestMethods.Http.Get; 
var response = request.GetResponse(); 
var queryString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
var parts = queryString.Split('&'); 
var token = parts[1].Substring(parts[1].IndexOf('=') + 1); 
var tokenSecret = parts[0].Substring(parts[0].IndexOf('=') + 1); 
var queryString2 = String.Format("oauth_token={0}", token); 

//AUTHORIZE WITH CREDENTIALS FROM USER. 
var authorizeUrl = "https://api.projectplace.com/authorize?" + queryString; 
Process.Start(authorizeUrl);` 

//TRY AND READ VERIFICATION STRING AFTER AUTHORIZATION REDIRECT` 
String oauthVerifier = HttpContext.Current.Request.QueryString["oauth_verifier"]; 

不幸的是,一旦我做到了这一点,我似乎无法得到一个返回的查询字符串显示oauth_verifier我我清楚地看到地址栏中显示的字符串。 (是的,这是一种非常新颖的描述方式,我正在学习代码以及OAuth:P)。

感谢您的帮助迄今。我试图运行上述,但它只是说,“对象引用未设置为对象的实例”。

另外,如果我尝试使用前面的代码来获取查询字符串/响应?从使用以下几行的启动请求中,querystring3只是回到了空白......非常令人沮丧! :)

var queryString3 = new StreamReader(response.GetResponseStream()).ReadToEnd(); var parts3 = queryString3.Split('&');

+0

当你说“在地址栏中输入”你的意思是它是一个查询字符串参数(例如http://yoursite.com?oauth_verifier= )? –

回答

0

我会认为是“在地址栏中输入”你的意思是,oauth_verifier通过在重定向URL查询字符串参数传递给你的网站从ProjectPlace服务器。为了在C#服务器端代码阅读本,你会使用类似以下内容(我修改了这个解决方案示例代码):

requestUri.AppendFormat("?oauth_consumer_key={0}&", consumerKey); 
requestUri.AppendFormat("oauth_nonce={0}&", nonce); 
requestUri.AppendFormat("oauth_timestamp={0}&", timeStamp); 
requestUri.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); 
requestUri.AppendFormat("oauth_version={0}&", "1.0"); 
requestUri.AppendFormat("oauth_signature={0}", signature); 
var request = (HttpWebRequest)WebRequest.Create(new Uri(requestUri.ToString())); 

//Note: this is unnecessary - GET is the default 
request.Method = WebRequestMethods.Http.Get; 
//By casting to HttpWebResponse you get access to the QueryString property 
var response = request.GetResponse() as HttpWebResponse; 
var oauthVerifier = response.QueryString["oauth_verifier"]; 

//The response stream contains the HTTP response body, 
//which will not contain the URL to which the redirect is sent 
//I'm not sure if there is anything there that you will need 
var responseBody = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

//AUTHORIZE WITH CREDENTIALS FROM USER. -- Not sure what this section is doing 
var queryString = string.Format("oauth_token={0}", oauthVerifier); 
var authorizeUrl = "https://api.projectplace.com/authorize?" + queryString; 
Process.Start(authorizeUrl); 
+0

感谢您的回复,我用一些示例代码修改了上面的问题。希望这更有意义。 – Timo

+0

嘿瑞恩,谢谢你的努力来帮助我。让我困惑的一件事是你在授权之前试图使用QueryString。只有在Process.Start(authorizeUrl)之后;将执行它将重定向,添加oauth_verifier参数。如果我尝试使用上面给出的代码,在Process.Start(authorizeUrl)之后;它会抛出一个错误“对象引用未设置为对象的实例”。 – Timo

+0

只是为了阐明我在上面的代码示例中放置的内容。之后的代码// TRY AND READ VERIFICATION STRING AFTER授权REDIRECT后,我认为我需要返回oauth_verifier参数。基本上,Process.Start(authorizeUrl);发送给我一个登录屏幕,我在代码中断了输入用户名和密码的内容,然后再执行下一个代码,尝试阅读oauth_verifier参数,我可以在输入用户名和密码后看到该参数。 – Timo