2013-04-04 63 views
2

我想要呼叫OpenPaths.cc rest service API这需要双腿OAuth。为此,我使用DevDefined.OAuth library(我尝试了nuget包和最新的github)。它在我不传递查询字符串中的参数时有效,但在传递参数时返回400 NOT AUTHORIZED。在OpenPaths.cc中传递查询字符串参数与OAuth呼叫呼叫不起作用

工作样品与无参数:

public class OpenPathsRequest 
{ 
    private const string accessKey = "your personal access key"; 
    private const string secretKey = "your personal secret"; 
    private const string url = "https://openpaths.cc/api/1"; 
    private OAuthSession session; 

    public OpenPathsRequest() 
    { 
     var consumerContext = new OAuthConsumerContext 
     { 
      ConsumerKey = accessKey, 
      ConsumerSecret = secretKey, 
      SignatureMethod = SignatureMethod.HmacSha1, 
      UseHeaderForOAuthParameters = true 
     }; 
     session = new OAuthSession(consumerContext, url, url, url); 
    } 

    private string GetWebResponseAsString(HttpWebResponse response) 
    { 
     Encoding enc = System.Text.Encoding.GetEncoding(1252); 
     StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc); 
     return loResponseStream.ReadToEnd(); 
    } 

    public string GetResponse() 
    { 
     HttpWebResponse response = session.Request().Get().ForUrl(url).ToWebResponse(); 
     var result = GetWebResponseAsString(response); 
     return result; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // create new OpenPathsRequest and get result 
     var request = new OpenPathsRequest(); 
     var response = request.GetResponse(); 
     Console.WriteLine(response); 
     Console.WriteLine("Press any key..."); 
     Console.ReadKey(); 
    } 
} 

但是,当我改变的GetResponse方法和在2个参数传递(START_TIME和END_TIME)像这样:

public string GetResponse() 
{    
    HttpWebResponse response = session.Request().Get().ForUrl(url).WithQueryParameters(
     new { start_time = 1364962612, end_time = 1364991412 }).ToWebResponse(); 
    var result = GetWebResponseAsString(response); 
    return result; 
} 

这导致下面的HTTP请求(消费者钥匙省略):

GET https://openpaths.cc/api/1?start_time=1364962612&end_time=1364991412 HTTP/1.1 
Authorization: OAuth oauth_nonce="7b5da37a-6227-4ded-ae8b-a695e789ef90",oauth_consumer_key="**********",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1365058952",oauth_version="1.0",oauth_signature="tAk4KMj%2FsiG6BTLSmvDNKXbBpNs%3D" 
Host: openpaths.cc 
Connection: Keep-Alive 

我得到一个错误re提供:

HTTP/1.1 400 Bad Request 
Date: Thu, 04 Apr 2013 07:03:26 GMT 
Content-Type: text/html; charset=UTF-8 
Connection: keep-alive 
Content-Length: 19 
Server: TornadoServer/2.0 
Set-Cookie: _xsrf=bf20487382b64eeb8646d31b0770db85; Path=/ 
Set-Cookie: session_id=ZTk2Mjk1MzIzNWNiMmRjMTY1ZmY5Y2ExNWUwMGY5ZTAxZmY1NGIyODljZGJiNzRlMmIyMWI4NTA3YzUwYWJlYg==|1365059006|7459a7ff95039279e9686ceb76b58918fd9f3e48; expires=Thu, 04 Apr 2013 07:18:26 GMT; Path=/ 

400: NOT AUTHORIZED 

非常感谢所有帮助。提前致谢。

Harmen

回答

2

解决!显然,OpenPaths.cc api要求在签名基本字符串中不签署附加查询参数。我相信这不符合OAuth规范,是吗?无论如何,与DevDefined.OAuth我可以很容易地解决这个问题之前调用WithQueryParameters像这样调用SignWithoutToken:

public string GetResponse() 
{    
    HttpWebResponse response = session.Request().Get().ForUrl(url). 
     SignWithoutToken(). 
     WithQueryParameters(new { start_time = 1364962612, end_time = 1364991412 }). 
     ToWebResponse(); 
    var result = GetWebResponseAsString(response); 
    return result; 
}