2

使用 Postman,我可以API使用 Postman 的 OAuth 1.0 授权成功地使用 Twitter 查询和创建定制的受众。但是,当尝试对 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);
4

1 回答 1

5

原来这是由于 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);
于 2016-08-22T14:05:34.313 回答