【问题标题】:I am trying to get request token from Twitter api using c#, but getting 400 bad request error我正在尝试使用 c# 从 Twitter api 获取请求令牌,但收到 400 bad request 错误
【发布时间】:2019-12-16 21:31:58
【问题描述】:

我正在尝试从 Twitter oauth/request_token API 获取请求令牌,用于基于用户的进一步身份验证。代码返回 400 bad request 错误。我知道请求中可能存在我无法捕捉到的小故障。我已尝试根据文档匹配所有内容,但缺少某些内容。任何线索都将是非常可观的。

        public void get_Oauth_token()
    {
        string oauth_nonce;
        string oauth_callback;
        string oauth_signature_method;
        string oauth_timestamp;
        string oauth_consumer_key;
        string oauth_signature;
        string oauth_version;
        string req_url;
        //set values to variables
        var dt = DateTime.Now;
        var ticks = dt.Ticks;
        var seconds = ticks / TimeSpan.TicksPerSecond;
        long unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        oauth_timestamp = unixTimestamp.ToString();
        oauth_callback = "http://127.0.0.1:4200/home";
        oauth_nonce = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 16).ToString(); //random string
        oauth_signature_method = "HMAC-SHA1";
        oauth_consumer_key = "xxxx";
        oauth_version = "1.0";
        req_url = "https://api.twitter.com/oauth/request_token";
        oauth_signature = create_auth_Signature_Task(oauth_nonce, oauth_callback, oauth_signature_method, oauth_timestamp, oauth_consumer_key, oauth_version, req_url);




        ///action
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(req_url);
        request.Method = "POST";
        request.UserAgent = "themattharris' HTTP Client";
        request.Host = "api.twitter.com";

        request.Headers.Add(HttpRequestHeader.Authorization, "OAuth oauth_callback = \"" + Uri.EscapeDataString(oauth_callback) + "\"" + ",oauth_consumer_key = \"" + oauth_consumer_key + "\",oauth_nonce = " + "\"" + oauth_nonce + "\", oauth_signature = \"" + oauth_signature + "\", oauth_signature_method = \"HMAC-SHA1\", oauth_timestamp = \"" + oauth_timestamp + "\", oauth_version = \"1.0\"");


        //WebResponse response = await request.GetResponseAsync();
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        Stream str = response.GetResponseStream();
        StreamReader reader = new StreamReader(str);
        dynamic resp = reader.ReadToEndAsync();

    }

    private string create_auth_Signature_Task(string oauth_nonce, string oauth_callback,
       string oauth_signature_method, string oauth_timestamp, string oauth_consumer_key, string oauth_version, string req_url)
    {
        string oauth_nonce_enc = Uri.EscapeDataString(oauth_nonce);
        string oauth_callback_enc = Uri.EscapeDataString(oauth_callback);
        string oauth_signature_method_enc = Uri.EscapeDataString(oauth_signature_method);
        string oauth_timestamp_enc = Uri.EscapeDataString(oauth_timestamp);
        string oauth_consumer_key_enc = Uri.EscapeDataString(oauth_consumer_key);
        string oauth_version_enc = Uri.EscapeDataString(oauth_version);
        string req_url_enc = Uri.EscapeDataString(req_url);
        string secret = Uri.EscapeDataString("xxxx") + "&";
        string signature_base = "POST&" + req_url_enc + "&" + Uri.EscapeDataString("oauth_consumer_key=" + oauth_consumer_key_enc + "&oauth_nonce=" + oauth_nonce + "&oauth_signature_method=" + oauth_signature_method_enc + "&oauth_timestamp=" + oauth_timestamp_enc + "&oauth_version=" + oauth_version_enc);


        return ShaHash(signature_base, secret);
    }

    private string ShaHash(string value, string key)
    {
        using (var hmac = new HMACSHA1(Encoding.UTF32.GetBytes(key)))
        {
            return Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(value)));//ByteToString(hmac.ComputeHash(Encoding.UTF32.GetBytes(value)));
        }
    }

【问题讨论】:

    标签: c# .net twitter oauth twitter-oauth


    【解决方案1】:

    只需使用 oauth-dotnetcore https://github.com/rhargreaves/oauth-dotnetcore。这将有助于创建您的 Oauth 1.0a 授权标头。

     var oauthClient = new OAuthRequest
            {
                Method = "POST",
                Type = OAuthRequestType.RequestToken,
                SignatureMethod = OAuthSignatureMethod.HmacSha1,
                ConsumerKey = consumerKey,
                ConsumerSecret = consumerSecret,
                RequestUrl = "https://api.twitter.com/oauth/request_token",
                Version = "1.0a",
                Realm = "twitter.com",
                CallbackUrl = callbackUrl
            };
    

    然后你可以像这样得到授权标头:

     string auth = oauthClient.GetAuthorizationHeader();
    client.DefaultRequestHeaders.Add("Authorization", auth);
    

    然后使用任何客户端发出 http 请求。

    【讨论】:

      【解决方案2】:

      您可以使用支持async 请求的HttpClient 而不是HttpWebRequest。 尝试使用此代码块

      public async void GetToken()
      {                       
            var httpClient = new HttpClient();
            var request = new HttpRequestMessage(HttpMethod.Post, "https://api.twitter.com/oauth2/token");
      
            string oauth_consumer_key = "<consumer key>";
            string oauth_consumer_secret = "<consumer secret>";
      
            string url = "https://api.twitter.com/oauth2/token?oauth_consumer_key=" + oauth_consumer_key + "&oauth_consumer_secret=" + oauth_consumer_secret;
      
            var customerInfo = Convert.ToBase64String(new UTF8Encoding()
                                .GetBytes(oauth_consumer_key + ":" + oauth_consumer_secret));
      
            request.Headers.Add("Authorization", "Basic " + customerInfo);
            request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8,
                                                                "application/x-www-form-urlencoded");
      
            HttpResponseMessage response = await httpClient.SendAsync(request);
      
            string json = await response.Content.ReadAsStringAsync();
            var serializer = new JavaScriptSerializer();
      
            dynamic item = serializer.Deserialize<object>(json);
      
          }
      

      P.S 请记住,与其为每次执行创建一个新的 HttpClient 实例,不如在应用程序的整个生命周期内共享一个 HttpClient 实例,否则您可能会遇到此错误

      Unable to connect to the remote server
      System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
      

      更多关于这个here

      【讨论】:

      • 感谢您的回复,但这个是为 oauth2/token 提供的,它提供不记名令牌作为响应。我能够度过这个难关。我在通过 oauth/request_token api 获取请求令牌时遇到问题。如果您也有解决方案,那就太好了。
      • @raghav 我认为您需要对您的签名进行编码。有没有可能签名中有等号?
      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2019-06-23
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2013-06-15
      相关资源
      最近更新 更多