首页 > 解决方案 > 如何让 RestSharp 不将 oauth_callback 参数添加到 Authentication 标头

问题描述

我正在尝试使用 RestSharp 连接到一个挑剔的 API。该 API 使用 OAuth1.0,并且在初始请求令牌上仅在查询中而不在身份验证标头中需要 oauth_callback 参数(我已经与 Postman 确认了这一点)。当我以这种方式构造请求时:

            var Authenticator = OAuth1Authenticator.ForRequestToken(mc_apiKey, mc_appsecret);
            Authenticator.ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader;
            Authenticator.SignatureMethod = OAuthSignatureMethod.PlainText;
            client.Authenticator = Authenticator;

            var request = new RestRequest(RequestToken, Method.POST);
            string AuthorizationCallBackURL = string.Format(LoopbackCallback);
            request.AddParameter(_oauthCallback, AuthorizationCallBackURL, ParameterType.QueryStringWithoutEncode);

并查看服务器上的日志,我在 Http 调用中看到了查询字符串,

http://192.168.0.187:8080/xxxx/ws/oauth/initiate?oauth_callback=http://192.168.0.187:8080/provider_emailer/callback.jsp

但它也在 Authentication 标头中:

    Headers:
    {Accept=[application/json, text/json, text/x-json, text/javascript, application/xml, text/xml], 
accept-encoding=[gzip, deflate], 
Authorization=[OAuth oauth_callback="http://192.168.0.187:8080/provider_emailer/callback.jsp",
oauth_consumer_key="XXXXXXXXXXXX",
oauth_nonce="cei09xm04qetk2ce",
oauth_signature="XXXXXXXXXXXXXXXX",
oauth_signature_method="PLAINTEXT",
oauth_timestamp="1591197088",
oauth_version="1.0"], 
Content-Length=[0], Content-Type=[null], 
cookie=[JSESSIONID=C8C8DB501382F7D1E52FE436600094C0], 
host=[192.168.0.187:8080], user-agent=[RestSharp/106.11.4.0]}

这会导致“NotAcceptable”响应。使用 Postman 完成的相同请求在 Authentication 标头中没有回调参数有效。难道我做错了什么?有没有办法只在查询字符串中获取回调?

标签: c#apirestsharpoauth-1.0a

解决方案


这很棘手。我查看了代码,当您使用不带此参数的重载时,我们没有将回调 URL 设置为工作流对象。所以,你在概念上是正确的。

但是,我们必须收集所有参数(默认和请求参数)以及 OAuth 参数来构建 OAuth 签名。然后,我们使用参数集合并提取所有名称以请求标头oauth_xauth_以请求标头开头的参数(如果您使用HttpAuthorizationHeader),然后我们将您的查询参数放入标头。

显然,这并不理想,它看起来像一个错误,所以我可以建议在 RestSharp 存储库中打开一个问题。应该不难修复。


推荐阅读