为什么在 C# 中通过 OAuth 1.0 连接到 WordPress 时我的 OAuth 签名不匹配?

Why does my OAuth signature not match when connecting to WordPress via OAuth 1.0 in C#?

我正在尝试完成 OAuth 1.0 身份验证过程的第一步并检索未经授权的请求令牌。

我一直收到 401 OAuth 签名与 WordPress 不匹配的错误。我知道问题在于我对签名进行哈希处理的方式,因为当我使用 Postman 时,我计算的签名与 Postman 计算的签名不同。我也可以通过邮递员成功检索和未经授权的请求令牌。

我在计算哈希时哪里出错了?我正在使用 HMAC-SHA1。

    private void AuthorizeWP()
    {
        string requestURL = @"http://mywordpressurl.com/oauth1/request";
        UriBuilder tokenRequestBuilder = new UriBuilder(requestURL);
        var query = HttpUtility.ParseQueryString(tokenRequestBuilder.Query);
        query["oauth_consumer_key"] = "myWordPressKey";
        query["oauth_nonce"] = Guid.NewGuid().ToString("N");
        query["oauth_signature_method"] = "HMAC-SHA1";
        query["oauth_timestamp"] = (Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds)).ToString();
        string signature = string.Format("{0}&{1}&{2}", "GET", Uri.EscapeDataString(requestURL), Uri.EscapeDataString(query.ToString()));
        string oauth_Signature = "";
        using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes("myWordPressSecret")))
        {
            byte[] hashPayLoad = hmac.ComputeHash(Encoding.ASCII.GetBytes(signature));
            oauth_Signature = Convert.ToBase64String(hashPayLoad);
        }
        query["oauth_signature"] = oauth_Signature;
        tokenRequestBuilder.Query = query.ToString();
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tokenRequestBuilder.ToString());
        request.Method = "GET";
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    }

我现在意识到我做错了什么。

使用 OAuth 1.0 时,当您为哈希密钥生成字节时,您必须将 consumer/client 秘密和令牌连接起来,中间使用“&”,即使您不这样做也是如此没有令牌.

来源:https://oauth1.wp-api.org/docs/basics/Signing.html

所以在我上面的代码中:

using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes("myWordPressSecret")))

需要:

using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes("myWordPressSecret&"))