第一步骤,获取url进行验证,然后验证程序就可以了。
使用与request_token中的方法签名的请求相同的方法,我得到“未授权”,“ oauth_problem =签名无效”。
我逐个字母地验证了代码,但找不到问题。
我具有服务器功能,但是我将代码可读性放在一个函数中,以发现问题:
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文档说签名也必须使用urlencode,然后在将其转换为base 64字符串后,我也使用urlencode:
request.Parameters[4].Value = WebUtility.UrlEncode(signature);
无论如何,仍返回“签名无效”。
有一些来自天空的光?谢谢!
也请通过电子交易链接查看此标头,我可能会漏掉一些细节
Authorization: OAuth oauth_nonce="0bba225a40d1bbac2430aa0c6163ce44",oauth_timestamp="1344885636",oauth_consumer_key="c5bb4dcb7bd6826c7c4340df3f791188",oauth_token="VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D",oauth_signature="%2FXiv96DzZabnUG2bzPZIH2RARHM%3D",oauth_signature_method="HMAC-SHA1"
`public void GetAccessToken(string oauthVerifier){ IRestResponse响应;
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);
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));
//does NormalizeParameters seperate by "&"
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)));
//encode signature
signature = "oauth_signature=\"" + WebUtility.UrlEncode(signature) + "\""
//TODO: generate header_string seperated by ","
request.AddHeader("Authorization",$"OAuth {<<header_string>>},{signature}");
response = client.Execute(request);
}`