You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

E*TRADE API的OAuth 1.0a签名计算错误排查求助

E*TRADE API的OAuth 1.0a签名计算错误排查求助

大家好,我最近在对接E*TRADE开发者平台时遇到了OAuth 1.0a签名计算的问题,折腾了好久都没解决,想请各位帮忙看看哪里出了问题。

E*TRADE开发者平台采用的是OAuth 1.0a授权协议,我按照官方开发者指南里给出的示例参数计算签名,但得到的结果始终和预期不符。不过我用同样的哈希方法在OAuth官方的另一个测试示例里却能得到正确结果,所以应该不是哈希函数本身的问题,大概率是我在构造签名基串或者密钥的时候漏了什么细节。

先给大家看官方给出的示例参数:

官方示例参数

项值
Keyc5bb4dcb7bd6826c7c4340df3f791188
Secret7d30246211192cda43ede3abd9b393b9
Access TokenVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI=
Access SecretXCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=
Timestamp1344885636
Nonce0bba225a40d1bbac2430aa0c6163ce44
HTTP MethodGET
URLhttps://api.etrade.com/v1/accounts/list
预期签名UOnPVdzExTAgHkcGWLLfeTaaMSM%3D

下面是我自己构造的签名基串和密钥:

我构造的签名基串与密钥

字段值
base stringGET&https%3A%2F%2Fapi.etrade.com%2Fv1%2Faccounts%2Flist&oauth_consumer_key%3Dc5bb4dcb7bd6826c7c4340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1344885636%26oauth_token%3DVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D
Key7d30246211192cda43ede3abd9b393b9&XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=

按照这个计算出来的签名是8alOEOXdzxx+N7+77VRyducKWJM=,和官方预期的完全不一样。

我用的是Delphi的HMAC_SHA1实现,代码如下:

result := TNetEncoding.Base64.EncodeBytesToString(THashSHA1.GetHMACAsBytes(AData, AKey));

为了验证这个哈希方法没问题,我拿OAuth官方的另一个测试案例试了试,结果完全正确:

OAuth官方示例验证(结果正确)

字段值
base stringGET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal
keykd94hf93k423kf44&pfkkdhi9sl3r4s00
预期签名tR3+Ty81lMeYAr/Fid0kMTYa/WM=

对应的Delphi验证代码是:

// an example from OAuth core 1.0a
AString :=
'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg' +
'%26oauth_consumer_key%3Ddpf43f3p2l4k3l03' +
'%26oauth_nonce%3Dkllo9940pd9333jh' +
'%26oauth_signature_method%3DHMAC-SHA1' +
'%26oauth_timestamp%3D1191242096' +
'%26oauth_token%3Dnnch734d00sl2jdk' +
'%26oauth_version%3D1.0' +
'%26size%3Doriginal';

result := EncodeBase64(THashSHA1.GetHMACAsBytes(AString,
'kd94hf93k423kf44&pfkkdhi9sl3r4s00'));
// 返回的结果正确

所以现在我确定哈希方法没问题,应该是我在处理ETRADE的签名基串或者密钥时哪里弄错了。下面是我构造ETRADE签名的完整Delphi代码,麻烦大家帮我看看哪里有问题:

我构造E*TRADE签名的代码

// ETrade test case from developer guides
// Following the Signature example
//    Item          Value
//    Key           c5bb4dcb7bd6826c7c4340df3f791188
//    Secret        7d30246211192cda43ede3abd9b393b9
//    Access Token  VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI=
//    Access Secret XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=
//    Timestamp     1344885636
//    Nonce         0bba225a40d1bbac2430aa0c6163ce44
//    HTTP Method   GET
//    URL           https://api.etrade.com/v1/accounts/list
//    Resulting signature   UOnPVdzExTAgHkcGWLLfeTaaMSM%3D

URL := URIEncode('https://api.etrade.com/v1/accounts/list');
URL := 'GET&' + URL + '&';

Data.Add('oauth_consumer_key=c5bb4dcb7bd6826c7c4340df3f791188');
Data.Add('&oauth_nonce=0bba225a40d1bbac2430aa0c6163ce44');
Data.Add('&oauth_signature_method=HMAC-SHA1');
Data.Add('&oauth_timestamp=1344885636');
Data.Add('&oauth_token=VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI=');
Data.Add('&oauth_version=1.0');

AData := Data[0];
for i:= 1 to Data.Count - 1 do
  AData := AData + Data[i];

AData := URL + URIEncode(AData);

AKey := '7d30246211192cda43ede3abd9b393b9&XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=';

result := TNetEncoding.Base64.EncodeBytesToString(THashSHA1.GetHMACAsBytes(AData, AKey));
// 返回的结果不正确

我总觉得是签名基串的构造哪里有小问题,比如参数排序?或者编码细节?有没有大佬能帮我指出来呀,谢谢了!

备注:内容来源于stack exchange,提问作者user5864258

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:55:28