c# - 如何让 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 标头中没有回调参数有效。难道我做错了什么?有没有办法只在查询字符串中获取回调?
解决方案
这很棘手。我查看了代码,当您使用不带此参数的重载时,我们没有将回调 URL 设置为工作流对象。所以,你在概念上是正确的。
但是,我们必须收集所有参数(默认和请求参数)以及 OAuth 参数来构建 OAuth 签名。然后,我们使用参数集合并提取所有名称以请求标头oauth_
或xauth_
以请求标头开头的参数(如果您使用HttpAuthorizationHeader
),然后我们将您的查询参数放入标头。
显然,这并不理想,它看起来像一个错误,所以我可以建议在 RestSharp 存储库中打开一个问题。应该不难修复。
推荐阅读
- c++ - 手动设置 cin.fail()
- php - PHP intl NumberFormatter::SPELLOUT 的源代码在哪里?
- sql - SQL 过滤掉具有多个列条目的行
- angular - 服务的依赖注入不起作用
- python - 值的python字典具有列表映射
- java - 如何使用 mongodb java 驱动程序和 Wildfly 配置日志记录
- c - 使用 memcpy 复制结构的一部分
- google-compute-engine - gcloud 由于(SSLHandshakeError)而崩溃:[SSL:UNKNOWN_PROTOCOL]
- javascript - 从对象获取经度和纬度
- jquery - jquery-ui sortable - 拖动时隐藏原始列表隐藏被拖动项