【问题标题】:401 Error when trying to get Request Token尝试获取请求令牌时出现 401 错误
【发布时间】:2011-10-25 20:20:43
【问题描述】:

resp = (HttpWebResponse)request.GetResponse();是的,我知道这可能是一些愚蠢的错误,或者只是我不精通 Oauth 的东西,但我已经停了下来,不知道从哪里开始,经过多次搜索和尝试,我虚心寻求帮助。

我正在尝试从 Twitter 获取请求令牌以尝试获取用户的 Twitter 提要,但由于其他业务原因,我无法使用库...

这是目前为止的代码:

     Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters.Add("oauth_callback", "www.url.com/redirect.aspx");
        parameters.Add("oauth_consumer_key", <Consumer_KEY>);
        parameters.Add("oauth_nonce", generateNonce());
        parameters.Add("oauth_signature_method", "HMAC-SHA1");
        parameters.Add("oauth_timestamp", CurrentUNIXTimestamp.Get());
        parameters.Add("oauth_version", "1.0");

        parameters = parameters.OrderBy(x => x.Key).ToDictionary(v => v.Key, v => v.Value);
        string concat = "";
        string OAuthHeader = "OAuth ";
        foreach (string k in parameters.Keys)
        {
            if (k == "oauth_callback")
            {
                concat += k + "%3D" + EncodeToUpper(parameters[k]) + "%26";
                OAuthHeader += k + "=" + "\"" + EncodeToUpper(parameters[k]) + "\", ";
            }
            else
            {
                concat += k + "%3D" + parameters[k] + "%26";
                OAuthHeader += k + "=" + "\"" + parameters[k] + "\", ";
            }

        }

        concat = concat.Remove(concat.Length - 3, 3);

        concat = "POST&" + EncodeToUpper("https://api.twitter.com/oauth/request_token" ) + "&" + concat;

        //byte[] content = Encoding.UTF8.GetBytes(concat);

        HMACSHA1 hmacsha1 = new HMACSHA1();
        hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", EncodeToUpper(<CONSUMER SECRET>, ""));

        byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(concat);
        byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);

        string hash =  Convert.ToBase64String(hashBytes);
        OAuthHeader += "oauth_signature=\"" + EncodeToUpper(hash) + "\"";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth/request_token");
        request.Method = "POST";
        request.Headers["Authorization"] = OAuthHeader;

        StringBuilder responding = new StringBuilder();
        HttpWebResponse resp = null;
        try
        {
            resp = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException exc)
        {
            lblError.Text = "Error Connecting to Social Network " + exc.Message;
        }
        if (resp != null)
        {
            using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
            {
                responding.Append(reader.ReadToEnd());
            }
        }

Nonce 的一个示例是“ne8ehvVr0pW2EUxNHdxdyqbi8Fwphatt3SW1yerTyXH”,CurrentUNIXTimestamp 由

生成
         public static class CurrentUNIXTimestamp
         {
              public static string Get()
              {
                    return Convert.ToString((int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds);
               }
         }

我已经尝试了尽可能多的事情,不再存在客户端/浏览器问题(这是许多其他答案),服务器时间与英国夏令时正确(我不知道这是否会是一个问题,但我尝试在 unix 时间戳上添加一个小时仍然是 401。),我已经在 twitter 应用程序页面上定义了回调 url

我在 facebook 上使用了相同的应用程序(我知道它的 oauth 不同,但可能会有所帮助)

实际错误出现在 resp = (HttpWebResponse)request.GetResponse(); 处,出现 401 错误。我无法从 exc.response 对象中获得更多详细信息,有人能说如何从 VS2008 中的错误中获取有用的信息吗?

感谢您的任何回答

【问题讨论】:

    标签: c# twitter oauth twitter-oauth


    【解决方案1】:

    我在实现 OAuth 时遇到的最困难的问题是处理字符编码。这是非常特别的。

    这是我最终为它编写的代码。

    private static string UrlEncode(IEnumerable<KeyValuePair<string, object>> parameters)
    {
        StringBuilder parameterString = new StringBuilder();
    
        var paramsSorted = from p in parameters
                           orderby p.Key, p.Value
                           select p;
    
        foreach (var item in paramsSorted)
        {
            if (parameterString.Length > 0)
            {
                parameterString.Append("&");
            }
    
            if(item.Value.GetType() == typeof(string) )
                    parameterString.Append(
                            string.Format(
                                    CultureInfo.InvariantCulture,
                                    "{0}={1}",
                                    UrlEncode(item.Key),
                                    UrlEncode(item.Value as string)));
        }
    
        return UrlEncode(parameterString.ToString());
    }
    
    public static string UrlEncode(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            return string.Empty;
        }
    
        value = Uri.EscapeDataString(value);
    
        // UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F
        value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper());
    
        // these characters are not escaped by UrlEncode() but needed to be escaped
        value = value
            .Replace("(", "%28")
            .Replace(")", "%29")
            .Replace("$", "%24")
            .Replace("!", "%21")
            .Replace("*", "%2A")
            .Replace("'", "%27");
    
        // these characters are escaped by UrlEncode() but will fail if unescaped!
        value = value.Replace("%7E", "~");
    
        return value;
    }
    

    如果你真的厌倦了,你可以使用我库中的 WebRequestBuilder 类来为你做所有的 OAuth 工作:http://www.twitterizer.net/

    【讨论】:

    猜你喜欢
    • 2021-11-04
    • 2019-06-23
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多