【问题标题】:E-trade: requesting access token, I get signature invalid电子交易:请求访问令牌,我得到签名无效
【发布时间】:2020-10-03 15:17:15
【问题描述】:

第一。 step,获取url进行验证,verifier就ok了。

使用与 request_token 中相同的方法对请求进行签名,我得到“未授权”,“oauth_problem = signature invalid”。

我一个字一个字地验证代码,没找到问题。

  1. 步骤,请求令牌 -> 确定
  2. 在url中获取验证码->OK
  3. 正在生成 access_token,签名无效。

我有几个函数,但我把可读的代码放在一个函数中来找出问题:

public void GetAccessToken(string oauthVerifier)
    {
        IRestResponse response;

        RestClient client = new RestClient(apiURI);
        string timeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
        string atNonce = Guid.NewGuid().ToString();


        RestRequest request = new RestRequest(GET_ACCESS_TOKEN_URL, Method.GET);

        request.AddParameter("oauth_consumer_key", consumerKey);
        request.AddParameter("oauth_timestamp", timeStamp);
        request.AddParameter("oauth_nonce", atNonce);
        request.AddParameter("oauth_signature_method", SIGNATURE_METHOD);
        request.AddParameter("oauth_signature", "");
        request.AddParameter("oauth_token", token);
        request.AddParameter("oauth_verifier", oauthVerifier);

        //var parameters = new SortedDictionary<string, string>();


        var parameters = new SortedDictionary<string, string>
        {
            {"oauth_consumer_key", consumerKey},
            {"oauth_timestamp", timeStamp},
            {"oauth_nonce", atNonce},
            {"oauth_signature_method", SIGNATURE_METHOD},
            { "oauth_token", token },
            { "oauth_verifier", oauthVerifier }
        };

        var sb = new StringBuilder();
        sb.Append("GET");
        sb.Append("&" + WebUtility.UrlEncode(apiURI + GET_ACCESS_TOKEN_URL));
        sb.Append("&" + WebUtility.UrlEncode(NormalizeParameters(parameters)));

        var signatureBase = sb.ToString();
        var signatureKey = string.Format("{0}&{1}", WebUtility.UrlEncode(consumerSecret), WebUtility.UrlEncode(tokenSecret));

        var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey));
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase)));

        request.Parameters[4].Value = signature;


        response = client.Execute(request);
    }

响应变量“未授权”,因为“signature_invalid”。

欢迎任何帮助,提前谢谢!

更新 1

Oauth 文档说签名也必须进行 urlencoded,然后我将其转换为 base 64 字符串后,我也对其进行 urlencode:

request.Parameters[4].Value = WebUtility.UrlEncode(signature);

无论如何,仍然返回“签名无效”。

那里有来自天上的光?谢谢!

【问题讨论】:

  • 您的 token 变量在请求参数和 sig 中使用之前是否已经编码。基本字符串?另请出示您的NormalizeParameters 方法。
  • 你有没有让这个工作?有同样的问题
  • 我刚刚成功完成了这项工作。对我来说,这个问题很荒谬。与请求令牌一起返回的令牌秘密在 C# 中自动进行了 url 编码。因此,当我为访问令牌创建 hmac 哈希时,它被双重 url 编码。我只需要对它进行 url 解码。

标签: c# oauth access-token http-status-code-401 etrade-api


【解决方案1】:

您使用的是沙盒还是直播?

首先让它在沙盒中运行是一个很好的步骤。

之后,您必须从 e-trade 获取密钥。

另外,我相信有些网站会验证您的 oauth 签名,这会给您提供更多信息。

【讨论】:

  • 我有沙盒凭据,直到我让它工作。我还不能得到确切的签名,仍然没有运气。
【解决方案2】:

还请查看 E-Trade 链接中的此标题,我可能错过了一些细节

Authorization: OAuth oauth_nonce="0bba225a40d1bbac2430aa0c6163ce44",oauth_timestamp="1344885636",oauth_consumer_key="c5bb4dcb7bd6826c7c4340df3f791188",oauth_token="VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D",oauth_signature="%2FXiv96DzZabnUG2bzPZIH2RARHM%3D",oauth_signature_method="HMAC-SHA1"

`public void GetAccessToken(string oauthVerifier) { IRestResponse 响应;

    RestClient client = new RestClient(apiURI);
    string timeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
    string atNonce = Guid.NewGuid().ToString();


    RestRequest request = new RestRequest(GET_ACCESS_TOKEN_URL, Method.GET);

    var parameters = new SortedDictionary<string, string>
    {
        {"oauth_consumer_key", consumerKey},
        {"oauth_timestamp", timeStamp},
        {"oauth_nonce", atNonce},
        {"oauth_signature_method", SIGNATURE_METHOD},
        {"oauth_token", token },
        {"oauth_verifier", oauthVerifier }
    };

    var sb = new StringBuilder();
    sb.Append("GET");
    sb.Append("&" + WebUtility.UrlEncode(apiURI + GET_ACCESS_TOKEN_URL));

    //does NormalizeParameters seperate by "&"
    sb.Append("&" + WebUtility.UrlEncode(NormalizeParameters(parameters)));

    var signatureBase = sb.ToString();
    var signatureKey = string.Format("{0}&{1}", WebUtility.UrlEncode(consumerSecret), WebUtility.UrlEncode(tokenSecret));

    var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey));
    string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase)));

    //encode signature
    signature = "oauth_signature=\"" + WebUtility.UrlEncode(signature) + "\""

    //TODO: generate header_string seperated by ","
    request.AddHeader("Authorization",$"OAuth {<<header_string>>},{signature}");

    response = client.Execute(request);
}`

【讨论】:

  • 嗨拉尔夫,感谢您的回答!事实并非如此。仍然得到签名无效。我还以与签名相同的顺序对其进行了测试,并对其进行了更改。电子贸易文档也说顺序无关紧要:developer.etrade.com/getting-started/developer-guides(见签名部分)。但我还是尝试了,不幸的是结果相同。
  • 已经编辑了上面的代码,我想你错过了授权头:)。 > 也必须用 "," 分隔
  • 还要确保在编码值后保持这种格式 oauth_nonce="0bba225a40d1bbac2430aa0c6163ce44",next....
  • 另外,我使用“标题”而不是“查询字符串”的原因是因为他们没有给出查询字符串的外观示例。你必须做很多试验和错误才能弄清楚
  • 我在 request_token 请求中得到了签名,它没有你说的这个头,签名只和其他参数一起工作,为什么要复制信息?不管怎样,我测试了你的代码,但没有用。
猜你喜欢
  • 2011-10-25
  • 2011-04-25
  • 1970-01-01
  • 2013-08-10
  • 2022-09-27
  • 2017-03-28
  • 2021-03-16
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多