【发布时间】:2018-11-05 09:16:11
【问题描述】:
我正在拨打以下电话StackPath
我尝试了各种现有的库,例如oauth 和MaxCDN,它们都返回响应:
{"code":500,"error":{"message":"Invalid signature","type":""}}
所有使用上述 oauth 库的 Get 请求都可以正常工作,但不能用于 POST。
使用 Postman,我能够成功地向 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 - 随时为未来的用户回答。
【问题讨论】: