【发布时间】:2020-10-03 15:17:15
【问题描述】:
第一。 step,获取url进行验证,verifier就ok了。
使用与 request_token 中相同的方法对请求进行签名,我得到“未授权”,“oauth_problem = signature invalid”。
我一个字一个字地验证代码,没找到问题。
- 步骤,请求令牌 -> 确定
- 在url中获取验证码->OK
- 正在生成 access_token,签名无效。
我有几个函数,但我把可读的代码放在一个函数中来找出问题:
public void GetAccessToken(string oauthVerifier)
{
IRestResponse response;
RestClient client = new RestClient(apiURI);
string timeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
string atNonce = Guid.NewGuid().ToString();
RestRequest request = new RestRequest(GET_ACCESS_TOKEN_URL, Method.GET);
request.AddParameter("oauth_consumer_key", consumerKey);
request.AddParameter("oauth_timestamp", timeStamp);
request.AddParameter("oauth_nonce", atNonce);
request.AddParameter("oauth_signature_method", SIGNATURE_METHOD);
request.AddParameter("oauth_signature", "");
request.AddParameter("oauth_token", token);
request.AddParameter("oauth_verifier", oauthVerifier);
//var parameters = new SortedDictionary<string, string>();
var parameters = new SortedDictionary<string, string>
{
{"oauth_consumer_key", consumerKey},
{"oauth_timestamp", timeStamp},
{"oauth_nonce", atNonce},
{"oauth_signature_method", SIGNATURE_METHOD},
{ "oauth_token", token },
{ "oauth_verifier", oauthVerifier }
};
var sb = new StringBuilder();
sb.Append("GET");
sb.Append("&" + WebUtility.UrlEncode(apiURI + GET_ACCESS_TOKEN_URL));
sb.Append("&" + WebUtility.UrlEncode(NormalizeParameters(parameters)));
var signatureBase = sb.ToString();
var signatureKey = string.Format("{0}&{1}", WebUtility.UrlEncode(consumerSecret), WebUtility.UrlEncode(tokenSecret));
var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey));
string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase)));
request.Parameters[4].Value = signature;
response = client.Execute(request);
}
响应变量“未授权”,因为“signature_invalid”。
欢迎任何帮助,提前谢谢!
更新 1
Oauth 文档说签名也必须进行 urlencoded,然后我将其转换为 base 64 字符串后,我也对其进行 urlencode:
request.Parameters[4].Value = WebUtility.UrlEncode(signature);
无论如何,仍然返回“签名无效”。
那里有来自天上的光?谢谢!
【问题讨论】:
-
您的
token变量在请求参数和 sig 中使用之前是否已经编码。基本字符串?另请出示您的NormalizeParameters方法。 -
你有没有让这个工作?有同样的问题
-
我刚刚成功完成了这项工作。对我来说,这个问题很荒谬。与请求令牌一起返回的令牌秘密在 C# 中自动进行了 url 编码。因此,当我为访问令牌创建 hmac 哈希时,它被双重 url 编码。我只需要对它进行 url 解码。
标签: c# oauth access-token http-status-code-401 etrade-api