OAuth 1.0 生成签名与 Postman 生成签名

OAuth 1.0 Generate Signature vs Postman Generate Signature

我正在为 Woocommerce 插件的 API 编写一个工具,它是 WordPress 插件之一。此工具使用 OAuth 1.0 系统进行身份验证。当我设置我的请求并通过邮递员发送时,我可以毫无问题地得到我的答复。我的问题始于我自己编写的测试应用程序。当我用在Postman中找到的相同值创建签名时,我从Postman工具中发现了一个不同的值。

文档中指定了许多基本字符串。我用指定的密钥加密这个值并创建一个签名。此签名与文档上的签名相同。所以,从这里我可以了解到,我的测试工具运行很顺利。 (https://oauth.net/core/1.0a/#RFC2045 - 附录 A.5.2。计算签名值 )

当我将使用相同工具从 Postman 获取的值添加到我的测试工具时,我发现了不同的结果。这里想到的是Postman工具又加了一个参数

我的Postman值是:

我可以毫无问题地使用这些值进行操作。我向测试应用程序添加相同的值并获得输出;

邮递员:tcBdkwXJL9Ad5RZFTQ36Vh34mYM=

我的测试应用:UJ2it9opCslL0Jjy7/T/C7Dw8rc=

我正在用 delphi 开发相关的测试应用程序。如果你需要代码,我已经在下面分享了。

procedure TForm1.Button1Click(Sender: TObject);
var
 p1, p2, full: string;
begin
 p1 := cmbReqType.Text;

 p2 :=  TNetEncoding.URL.Encode(edit1.Text);
 p3 := 'oauth_consumer_key=' + oauth_consumer_key.Text
        + '&oauth_signature_method='+oauth_signature_method.Text
        + '&oauth_timestamp='+oauth_timestamp.Text +
        '&oauth_nonce=' + oauth_nonce.Text +
        '&oauth_version='+ oauth_version.Text;

 xp3 := p3;
 p3 := TNetEncoding.URL.Encode(p3);
 full := p1 + '&' + p2 + '&' + p3;
 Memo1.Lines.Text := System.UTF8Encode(Trim(full));

 HMAC_SHA1 := THashSHA1.Create;
 Edit2.text := TNetEncoding.Base64.EncodeBytesToString(HMAC_SHA1.GetHMACAsBytes(TEncoding.UTF8.GetBytes(Trim(memo1.text)), TEncoding.UTF8.GetBytes(Trim(secret_key.Text))));

 if Trim(Edit2.Text) = 'tcBdkwXJL9Ad5RZFTQ36Vh34mYM=' then
 begin
   ShowMessage('correct.');
 end else
     begin
       ShowMessage('not correct.');
     end;
end;

P.S:忘记代码中的丑陋。我编码很简单:)

P.S: 我在下面留下类似的话题。大多数人不回复答案。

1- How do I view the raw signature Postman uses when it makes its OAuth requests?

2- How does Postman Rest Client create Oauth Signature ? Unable to resolve Oauth_Signature in android

...

在此先感谢您的帮助。

构建 Signature Base String 时,OAuth1 要求参数按名称排序。在您的情况下,这意味着 oauth_nonce 必须紧跟在 oauth_consumer_key.

之后

此外,在计算 HMAC 时,密钥必须同时包含 Consumer Secret 和 Token Secret,以 & 分隔,即使令牌为空。由于您没有令牌,因此您必须将 & 附加到您的密码。