401 Ошибка при попытке получить маркер запроса - PullRequest
0 голосов
/ 12 августа 2011

resp = (HttpWebResponse) request.GetResponse (); Хорошо, я знаю, что это, вероятно, какая-то глупая ошибка, или просто я не очень хорошо разбираюсь в вещах Oauth, но я остановился и не знаю, куда идти дальшеПосле многих поисков и попыток я скромно прошу помощи.

Я пытаюсь получить токен запроса от 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());
            }
        }

Примером одноразового номера является "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);
               }
         }
* 1010, так как я попыталсямногие вещи, о которых я могу думать, больше не являются проблемой клиента / браузера (что было многими другими ответами), серверное время соответствует британскому летнему времени (я не знаю, будет ли это проблемой, но я попытался добавитьчас до отметки времени Unix по-прежнему 401.), и я определил URL-адрес обратного вызова на странице приложения Twitter

Я получил тТо же самое приложение, работающее с Facebook (я знаю, что он другой, но может помочь)

Фактическая ошибка происходит в resp = (HttpWebResponse) request.GetResponse () ;, который выдает ошибку 401.Я не мог получить более подробную информацию от объекта exc.response, кто-нибудь может сказать, как получить что-то полезное из ошибки в VS2008?

Спасибо за любые ответы

1 Ответ

0 голосов
/ 11 октября 2011

Самой сложной проблемой, с которой я столкнулся при реализации 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:

...