E*TRADE API的OAuth 1.0a签名计算错误排查求助
E*TRADE API的OAuth 1.0a签名计算错误排查求助
大家好,我最近在对接E*TRADE开发者平台时遇到了OAuth 1.0a签名计算的问题,折腾了好久都没解决,想请各位帮忙看看哪里出了问题。
E*TRADE开发者平台采用的是OAuth 1.0a授权协议,我按照官方开发者指南里给出的示例参数计算签名,但得到的结果始终和预期不符。不过我用同样的哈希方法在OAuth官方的另一个测试示例里却能得到正确结果,所以应该不是哈希函数本身的问题,大概率是我在构造签名基串或者密钥的时候漏了什么细节。
先给大家看官方给出的示例参数:
官方示例参数
| 项 | 值 |
|---|---|
| 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 |
| 预期签名 | UOnPVdzExTAgHkcGWLLfeTaaMSM%3D |
下面是我自己构造的签名基串和密钥:
我构造的签名基串与密钥
| 字段 | 值 |
|---|---|
| base string | GET&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 |
| Key | 7d30246211192cda43ede3abd9b393b9&XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es= |
按照这个计算出来的签名是8alOEOXdzxx+N7+77VRyducKWJM=,和官方预期的完全不一样。
我用的是Delphi的HMAC_SHA1实现,代码如下:
result := TNetEncoding.Base64.EncodeBytesToString(THashSHA1.GetHMACAsBytes(AData, AKey));
为了验证这个哈希方法没问题,我拿OAuth官方的另一个测试案例试了试,结果完全正确:
OAuth官方示例验证(结果正确)
| 字段 | 值 |
|---|---|
| base string | 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 |
| key | kd94hf93k423kf44&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
相关产品推荐
相关产品推荐

