OAuth 1.0 POST-“无效签名” C#

时间:2018-11-01 12:07:30

标签: c# .net oauth

我正在拨打以下StackPath

我尝试了各种现有的库,例如oauthMaxCDN,它们都返回响应:

{"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一起使用-随时为将来的用户回答。

1 个答案:

答案 0 :(得分:0)

您不正确地构成了基本字符串。具体来说,RFC 5849 §3.4.1为必须如何规范,排序和转义URI路径和查询参数(或实体请求主体)提供了精确的指导。 Uri.EscapeDataString(_url)是不够的。

我建议使用现有的,经过测试的库来创建签名,而不是从头开始重新实现RFC。