2012-12-03 28 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