3

我一直在寻找这个问题的答案。基本上,我正在创建一个 C# 应用程序,它(在它的第一个化身中)将使用使用 OAuth 1.0a 的 Projectplace API 进行身份验证。它目前将 oauth_verifier 返回到地址栏,但是当我使用该var response = request.GetResponse();方法时,它首先返回我作为授权的一部分发送的oauth_tokenand 。oauth token_secret

也许我误解了这个过程的工作方式,但我已经阅读了那里的每一个答案,似乎没有一个答案能解决这个问题。在加载回调 URL 后,在身份验证页面上输入我的用户名和密码后,您是否必须或是否可以从地址栏(或其他任何可以获得的地方)提取验证码?

我相信 OAuth1.0a 需要验证码来检索访问令牌,我找不到一种简单的方法来提取验证码。

我真的很感激任何帮助,这让我发疯了!

2012 年 3 月 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('&');

4

1 回答 1

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);
于 2012-12-03T16:51:11.570 回答