问题描述
在 E*Trade 授权 API documentation for Get Request Token 上,它声明 oauth_signature 是使用“shared secret
和 token secret
”生成的。
当我生成沙箱密钥时,我看到了以下信息:
Individual Consumer Key
Your active SANDBox API key is: abc123,and secret is: def456.
什么是 shared secret
和 token secret
,它们如何映射到上面提供的值?
解决方法
我想出了如何为 Get Request Token 生成签名。
同时需要 SANDBOX API key
和 SANDBOX API secret
。
我相信 shared secret
指的是 SANDBOX API secret
。似乎不需要 token secret
来为 Get Request Token 生成 oauth_signature
。
这是我使用 oauth-sign 库在 JavaScript 中生成 oauth_signature
的实现
const oauthsign = require("oauth-sign");
const oauth_consumer_key = "..."; // "SANDBOX API key"
const consumer_secret = "..."; // "secret"
const oauth_timestamp = "1614463663"; // current time in seconds
const oauth_nonce = "123abc";
const oauth_signature_method = "HMAC-SHA1";
const oauth_callback = "oob"; // out-of-band callback
const base_uri = "https://apisb.etrade.com/oauth/request_token"; // N.B. "apisb"
const oauth_signature = oauthsign.hmacsign(
"GET",base_uri,{ oauth_consumer_key,oauth_timestamp,oauth_nonce,oauth_signature_method,oauth_callback },consumer_secret
);
const paramsString = Object.entries({
oauth_consumer_key,oauth_callback,oauth_signature
}).map(([k,v]) => `${k}=${v}`).join("&");
const result = `${base_uri}?${paramsString}`;
console.log(result);
// will produce a URL like
// https://apisb.etrade.com/oauth/request_token?oauth_consumer_key=...&oauth_timestamp=1614463663&oauth_nonce=123abc&oauth_signature_method=HMAC-SHA1&oauth_callback=oob&oauth_signature=...