C#中的两脚OAuth实现

我正在尝试实施两条腿OAuth身份validation,因此我可以在网站上创建用户。 我设法制作了执行该任务的ruby代码,但我需要将其转换为C#。

我在C#中进行最后一次POST时遇到401错误,但代码实际上是相同的。 我在这里变得疯狂。 有人可以跳进去帮助我知道我的代码有什么问题吗?

ruby

consumer = OAuth::Consumer.new(KEY, SECRET, :http_method => :post) # response = consumer.request(:get, "#{SITE}/oauth/request_token.json") # request_token_hash = JSON.parse(response.body) # puts request_token_hash access_token = OAuth::AccessToken.new consumer user = { "user[name]" => 'John' } response = access_token.post("#{SITE}/users.json", user) user_hash = JSON.parse(response.body) puts user_hash 

C#

 string consumerKey = "KEY"; string consumerSecret = "SECRET"; Uri uri = new Uri("#{SITE}/oauth/request_token.json"); var oAuth = new OAuthBase(); // this class generates signatures string nonce = oAuth.GenerateNonce(); string timeStamp = oAuth.GenerateTimeStamp(); string outURL; string queryString; string sig = oAuth.GenerateSignature( uri, consumerKey, consumerSecret, string.Empty, string.Empty, "POST", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, out outURL, out queryString); sig = HttpUtility.UrlEncode(sig); var sb = new StringBuilder(uri.ToString()); sb.AppendFormat("?oauth_consumer_key={0}&", consumerKey); sb.AppendFormat("oauth_nonce={0}&", nonce); sb.AppendFormat("oauth_timestamp={0}&", timeStamp); sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); sb.AppendFormat("oauth_version={0}&", "1.0"); sb.AppendFormat("oauth_signature={0}", sig); var tokenRequest = (HttpWebRequest)WebRequest.Create(sb.ToString()); tokenRequest.Method = "POST"; var response = tokenRequest.GetResponse().GetResponseStream(); if (response != null) { var responseReader = new StreamReader(response); var requestToken = JsonConvert.DeserializeObject(responseReader.ReadToEnd()); System.Diagnostics.Debug.WriteLine("REQUEST TOKEN: " + requestToken.token.oauth_token); // EVERYTHING IS OK UNTIL HERE // Creating user nonce = oAuth.GenerateNonce(); timeStamp = oAuth.GenerateTimeStamp(); var usersUri = new Uri("#{SITE}/users.json"); // Generate signature string userSig = oAuth.GenerateSignature( userUri, consumerKey, consumerSecret, requestToken.token.oauth_token, requestToken.token.oauth_token_secret, "POST", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, out outURL, out queryString); userSig = HttpUtility.UrlEncode(userSig); // Generate request URL sb = new StringBuilder(userUri.ToString()); sb.AppendFormat("?oauth_consumer_key={0}&", consumerKey); sb.AppendFormat("oauth_nonce={0}&", nonce); sb.AppendFormat("oauth_timestamp={0}&", timeStamp); sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); sb.AppendFormat("oauth_version={0}&", "1.0"); sb.AppendFormat("oauth_token={0}&", requestToken.token.oauth_token); sb.AppendFormat("oauth_signature={0}&", userSig); sb.Append("user[name]=John"); // Prepare web request... var myRequest = (HttpWebRequest)WebRequest.Create(sb.ToString()); myRequest.Method = "POST"; // Get response and read it var reader = new StreamReader(myRequest.GetResponse().GetResponseStream()); // THROWS AN UNAUTHORIZED EXCEPTION (401 Status Error) System.Diagnostics.Debug.WriteLine("RESPONSE USER: " + reader.ReadToEnd()); 

谢谢,

Interesting Posts