我正在拨打以下StackPath
我尝试了各种现有的库,例如oauth和MaxCDN,它们都返回响应:
{"code":500,"error":{"message":"Invalid signature","type":""}}
使用上述oauth库的所有Get请求都可以正常工作,但不适用于POST。
使用邮递员,我能够向API进行成功发布,但是我不确定它们如何使用“授权”标签生成签名。
我使用以下方法创建了一个类来手动创建授权...
sb创建Authorization标头的值:
public string GenerateAuthorizationHeader(string method, string url)
{
StringBuilder sb = new StringBuilder("OAuth ");
sb.Append("oauth_consumer_key=\"" + _consumer_key + "\",");
sb.Append("oauth_nonce=\"" + _nonce + "\",");
sb.Append("oauth_signature=\"" + GetSignature() + "\",");
sb.Append("oauth_signature_method=\"" + _signature_method + "\",");
sb.Append("oauth_timestamp=\"" + _timestamp + "\",");
sb.Append("oauth_version=\"" + _version + "\"");
return sb.ToString();
}
GetSignature()创建一个基本字符串:
private string GetSignatureBaseString()
{
string basestring = "oauth_consumer_key=" + Uri.EscapeDataString(_consumer_key);
basestring += "&" + "oauth_nonce=" + Uri.EscapeDataString(_nonce);
basestring += "&" + "oauth_signature_method=" + Uri.EscapeDataString(_signature_method);
basestring += "&" + "oauth_timestamp=" + Uri.EscapeDataString(_timestamp);
basestring += "&" + "oauth_version=" + Uri.EscapeDataString(_version);
basestring = _method + "&" + Uri.EscapeDataString(_url) + "&" + Uri.EscapeDataString(basestring);
return basestring;
}
使用消费者机密对基本字符串进行哈希处理,GetSignature()返回字符串:
private string GetHashedSignature(string baseString)
{
var encode = new ASCIIEncoding();
byte[] keyBytes = encode.GetBytes(_consumer_secret);
byte[] msgBytes = encode.GetBytes(baseString);
string result = "";
using (HMACSHA1 sha1 = new HMACSHA1(keyBytes))
{
var hashed = sha1.ComputeHash(msgBytes);
result = Convert.ToBase64String(hashed);
}
return Uri.EscapeDataString(result);
}
GET和POST均无法使用我的代码。谁能在我的代码中发现错误,或者提供有关Postman如何生成其OAuth 1.0授权标头值(特别是oauth_signature)的任何信息?
**编辑我与RestSharp一起使用-随时为将来的用户回答。
答案 0 :(得分:0)
您不正确地构成了基本字符串。具体来说,RFC 5849 §3.4.1为必须如何规范,排序和转义URI路径和查询参数(或实体请求主体)提供了精确的指导。 Uri.EscapeDataString(_url)
是不够的。
我建议使用现有的,经过测试的库来创建签名,而不是从头开始重新实现RFC。