使用Postman我可以使用Postman的OAuth 1.0授权,成功地使用Twitter API
查询和创建定制的受众群体。但是,当尝试使用RestSharp执行相同操作时,我收到了未经授权的错误。
" UNAUTHORIZED_ACCESS" - "此请求未经过适当的身份验证"。
我的GET
请求验证正常,但POST请求失败。
_twitterRestClient = new RestClient("https://ads-api.twitter.com/1")
{
Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret)
};
var restRequest1 = new RestRequest(string.Format("/accounts/{0}/tailored_audiences", TwitterAccountId), Method.GET);
//this works and gives me a list of my tailored audiences
var response1 = _twitterRestClient.Execute(restRequest1);
var restRequest2 = new RestRequest(string.Format("/accounts/{0}/tailored_audiences?name=SampleAudience2&list_type=EMAIL", TwitterAccountId), Method.POST);
// this results in an "Unauthorized" status code , and the message {\"code\":\"UNAUTHORIZED_ACCESS\",\"message\":\"This request is not properly authenticated\"}
var response2 = _twitterRestClient.Execute(restRequest2);
答案 0 :(得分:1)
原来这是由于RestSharp OAuth1实现中的一个怪癖。我认为它与这个问题有关 - https://www.bountysource.com/issues/30416961-oauth1-not-specifing-parameter-type。创建OAuth1签名的一部分涉及收集请求中的所有参数和其他详细信息,然后将其全部哈希。看起来当HTTP方法是POST时,RestSharp不期望查询字符串中的参数(这是有意义的),它期望它们在帖子体中。无论如何,如果您明确添加参数,那么它们将被选中并且OAuth1签名有效。 (如果这些参数位于帖子正文中,那么打开twitter API会起作用,因此我不需要将它们显式添加到查询字符串中)。更新现在有效的代码:
_twitterRestClient = new RestClient("https://ads-api.twitter.com/1")
{
Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessSecret)
};
var restRequest1 = new RestRequest(string.Format("/accounts/{0}/tailored_audiences", TwitterAccountId), Method.GET);
var response1 = _twitterRestClient.Execute(restRequest1);
var restRequest2 = new RestRequest(string.Format("/accounts/{0}/tailored_audiences", TwitterAccountId), Method.POST);
restRequest2.AddParameter("name", "SampleAudience2");
restRequest2.AddParameter("list_type", "EMAIL");
var response2 = _twitterRestClient.Execute(restRequest2);