【问题标题】:OAuth 1.0 POST - "Invalid Signature" C#OAuth 1.0 POST - “无效签名”C#
【发布时间】:2018-11-05 09:16:11
【问题描述】:

我正在拨打以下电话StackPath

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

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

【问题讨论】:

    标签: c# .net oauth


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      相关资源
      最近更新 更多