Go Twitter API Post message always returns无法验证您的身份

Go Twitter API Post message always returns无法验证您的身份,go,twitter-oauth,Go,Twitter Oauth,我在多种情况下使用相同的函数。它在任何地方都有效,除了我想发布推特的时候 我能够为用户获得oAuth令牌和所有东西,因此我的代码可以正常工作。但是,当我使用相同的代码(下面的示例)发布tweet时,我总是返回错误“无法验证您的身份” 有人能告诉我我做错了什么吗 func buildOAuth1Header(method, path string, params map[string]string, token *string, secret *string) string { value

我在多种情况下使用相同的函数。它在任何地方都有效,除了我想发布推特的时候

我能够为用户获得oAuth令牌和所有东西,因此我的代码可以正常工作。但是,当我使用相同的代码(下面的示例)发布tweet时,我总是返回错误“无法验证您的身份”

有人能告诉我我做错了什么吗

func buildOAuth1Header(method, path string, params map[string]string, token *string, secret *string) string {
    values := url.Values{}
    values.Add("oauth_nonce", generateNonce())
    values.Add("oauth_consumer_key", os.Getenv("twitter_consumer_key"))
    values.Add("oauth_signature_method", "HMAC-SHA1")
    values.Add("oauth_timestamp", strconv.Itoa(int(time.Now().Unix())))
    values.Add("oauth_token", os.Getenv("twitter_access_token"))
    values.Add("oauth_version", "1.0")

    for k, v := range params {
        values.Add(k, v)
    }

    parameterString := strings.Replace(values.Encode(), "+", "%20", -1)

    signatureBase := strings.ToUpper(method) + "&" + url.QueryEscape(strings.Split(path, "?")[0]) + "&" + url.QueryEscape(parameterString)
    signingKey := url.QueryEscape(os.Getenv("twitter_consumer_secret")) + "&" + url.QueryEscape(os.Getenv("twitter_token_secret"))
    signature := calculateSignature(signatureBase, signingKey)

    return "OAuth oauth_consumer_key=\"" + url.QueryEscape(values.Get("oauth_consumer_key")) + "\", oauth_nonce=\"" + url.QueryEscape(values.Get("oauth_nonce")) +
        "\", oauth_signature=\"" + url.QueryEscape(signature) + "\", oauth_signature_method=\"" + url.QueryEscape(values.Get("oauth_signature_method")) +
        "\", oauth_timestamp=\"" + url.QueryEscape(values.Get("oauth_timestamp")) + "\", oauth_token=\"" + url.QueryEscape(values.Get("oauth_token")) +
        "\", oauth_version=\"" + url.QueryEscape(values.Get("oauth_version")) + "\""
}
显然,当我试图为其他人发帖时,我必须向用户添加他的oauth_令牌和oauth_令牌

在上面的代码中,我将oauth_令牌放在“values.Get”(“oauth_令牌”)现在所在的位置。 在“os.Getenv(“twitter\u-token\u-secret”)”所在的位置上

所以我想说一切都很好,所有需要的数据都在那里

当我在《邮递员》中做同样的事情时,它确实起作用了!但不是在我自己的代码中。希望有人能向我解释我做错了什么

req.Header.Add("Authorization", buildOAuth1Header(method, "https://api.twitter.com/1.1/statuses/update.json?status=Hello%20there%20twitter%20api", nil, &token, &secret))
另外,当我检查Postman生成的代码和我的代码时,它们是相等的

邮递员

OAuth 
    oauth_consumer_key="xxxxxxxx5FDUQyYAOlBG9m",
    oauth_nonce="ALmEHDAZs8f",
    oauth_signature="SkZsKsBKf7z53jkTFXPcZDQspMA%3D"
    oauth_signature_method="HMAC-SHA1",
    oauth_timestamp="1606045722",
    oauth_token="000000000-lAWIw8qJHGATHNU2DJEJY62NchUFq9xxxxxxxx",
    oauth_version="1.0",
我的代码

OAuth 
    oauth_consumer_key="xxxxxxxx5FDUQyYAOlBG9m", 
    oauth_nonce="BpLnfgDsc2WD8F2qNfHK5a84jjJkwzDkh9h2fhfUVuS9jZ8u", 
    oauth_signature="uwzOxl2FVBH%2B9gDN7%2BTJkCxHh3w%3D", 
    oauth_signature_method="HMAC-SHA1", 
    oauth_timestamp="1606045680", 
    oauth_token="000000000-lAWIw8qJHGATHNU2DJEJY62NchUFq9xxxxxxxx", 
    oauth_version="1.0"
所以只有签名可能是“错的”,我确认,但我无法找出它

我为该特定请求生成签名的方式:

signingKey := url.QueryEscape(os.Getenv("twitter_consumer_secret")) + "&" + url.QueryEscape("user_token_secret")
其中,user\u token\u secret是在请求用户访问时从oauth端点返回的秘密。

查看一下,它可能会对您有所帮助。如果您感兴趣,可以检查oauth1使用的模块,它可以帮助您确定问题