问题描述
我正在为 Woocommerce 插件的 API 编写一个工具,它是 wordpress 插件之一。此工具使用 OAuth 1.0 系统进行身份验证。当我设置我的请求并通过邮递员发送它时,我可以毫无问题地得到我的答案。我的问题始于我自己编写的测试应用程序。当我使用 Postman 中找到的相同值创建签名时,我发现 Postman 工具中的值不同。
文档中指定了许多基本字符串。我用指定的密钥加密这个值并创建一个签名。此签名与文档上的签名相同。所以,我可以从这里了解到我的测试工具运行顺利。 (https://oauth.net/core/1.0a/#RFC2045 - 附录 A.5.2. 计算签名值 )
当我将使用相同工具从 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:忘记代码中的丑陋吧。我对它进行了简单的编码:)
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,用 &
分隔,即使令牌为空。由于您没有令牌,因此您必须将 &
附加到您的秘密。