Получение ошибки 400: неверный запрос при аутентификации через API Twitch.tv

Я новичок здесь, и я надеюсь, что кто-то может мне помочь. Я пытаюсь подключиться к twitch.tv Я пытаюсь получить oauth2 аутентификацию на twitch.tv с помощью небольшой программы на C#. Я использую запрос аутентификации twitch.tv. Вот мой код C#:

    var loginURL = "https://api.twitch.tv/kraken/oauth2/authorize?
                               response_type=code&"+
                               client_id="+ clientID+"
                               "&redirect_uri=http://localhost&"+
                               "state=TWStreamingStateAuthenticated";                    
    this.richTextBox1.Text = loginURL;
    string code = get_DownLoadString(loginURL);
    this.richTextBox1.Text = code;

Это та часть, которая не работает. Это дает мне ошибку 400: неверный запрос.

    WebRequest request = WebRequest.Create("https://api.twitch.tv/kraken/oauth2/token");
    request.Method = "POST";
    string postData = "client_id=" + clientID +
                      "&client_secret=" + clientSecret +
                      "&grant_type=authorization_code" +
                      "&redirect_uri=http://localhost" +
                      "&code=" + code +
                      "&state=TWStreamingStateAuthenticated";

    ASCIIEncoding encoding = new ASCIIEncoding();
    postData = HttpUtility.UrlEncode(postData);            
    byte[] byteArray = encoding.GetBytes(postData);
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = byteArray.Length;
    Stream datatream = request.GetRequestStream();
    datatream.Write(byteArray, 0, byteArray.Length);
    datatream.Close();
    WebResponse respone = request.GetResponse();
    MessageBox.Show(((HttpWebResponse)respone).StatusDescription);

Я надеюсь, что кто-то может помочь мне. А вот и метод Get_DownloadString(строковый URL).

private static string get_DownLoadString(string URL)
{
    try
    {
        string temp = (new WebClient().DownloadString(URL));
        return temp;
    }
    catch (WebException)
    {
        return null;
    }
}

1 ответ

Решение

Этот код мне не подходит:

    string postData = "client_id=" + clientID +
                      "&client_secret=" + clientSecret +
                      "&grant_type=authorization_code" +
                      "&redirect_uri=http://localhost" +
                      "&code=" + code +
                      "&state=TWStreamingStateAuthenticated";

    ASCIIEncoding encoding = new ASCIIEncoding();
    postData = HttpUtility.UrlEncode(postData);
    byte[] byteArray = encoding.GetBytes(postData);
    // ...

Вы URL-кодируете всю строку пост-данных. Это имеет эффект преобразования & а также = знаки в данных поста %26 а также %3d соответственно. Когда удаленный сервер получает эти данные, он сканирует их в поисках & а также = знаки, чтобы отделить имена параметров и значения. Конечно, он не найдет ничего, поэтому он предполагает, что у вас есть одно большое имя параметра без значения. Сервер, вероятно, ожидает значения для каждого из шести параметров, которые вы пытаетесь отправить, но не видите значения ни для одного из них, и это может быть причиной того, что вы получаете ошибку 400 Bad Request.

Вместо URL-кодирования всей строки, URL-кодируют значения параметров, которые могут содержать символы, отличные от букв и цифр. Я бы попробовал следующее вместо этого:

    string postData = "client_id=" + HttpUtility.UrlEncode(clientID) +
                      "&client_secret=" + HttpUtility.UrlEncode(clientSecret) +
                      "&grant_type=authorization_code" +
                      "&redirect_uri=" + HttpUtility.UrlEncode("http://localhost") +
                      "&code=" + HttpUtility.UrlEncode(code) +
                      "&state=TWStreamingStateAuthenticated";

    ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] byteArray = encoding.GetBytes(postData);
    // ...

Таким образом, удаленный сервер все равно увидит & а также = символы и т. д. смогут вытащить имена и значения параметров. Поскольку мы закодировали URL-адрес клиента, его секретный ключ, URL-адрес и код, любые содержащиеся в них символы, которые могут иметь значение в URL-адресе, не будут иметь этого значения и будут получены удаленным сервером в соответствии с назначением.

Кроме того, если вы все еще получаете сообщение об ошибке 400 Bad Request, попробуйте прочитать содержимое потока ответа, полученного путем вызова GetResponseStream() на ответ. Часто это будет содержать сообщение, которое поможет вам выяснить, что пошло не так.


Изучив ваш код, вы, похоже, неправильно поняли, как работает аутентификация OAuth. Ваш getDownload_String Метод не получит требуемый код доступа, он получит только HTML-текст страницы входа в Twitch.

Вот как работает аутентификация OAuth:

  1. Ваше приложение отправляет пользователя по URL-адресу для входа, чтобы пользователь мог войти в Twitch.
  2. Затем в веб-браузере пользователь вводит свои учетные данные для входа и отправляет страницу в Twitch.
  3. Затем Twitch API перенаправляет веб-браузер пользователя на URL перенаправления с добавленным кодом. Затем ваше веб-приложение считывает этот код из URL.

Если ваш код находится в веб-приложении, он сможет отвечать на URL, перенаправленный на шаг 3. В качестве альтернативы, вы можете использовать элемент управления WebBrowser ( Windows Forms, WPF) для обработки входа в Twitch и обработки Navigating событие. Если URL-адрес, по которому осуществляется переход, начинается с URL-адреса перенаправления, извлеките код из URL-адреса, отмените навигацию и скройте элемент управления веб-браузера для входа.

Наличие того, что кажется элементом управления RichTextBox, наряду с вашим комментарием о том, что ваш код является "небольшим приложением C#", заставляет меня думать, что ваш код является приложением Windows Forms или WPF. Если это так, то вам нужно либо:

  • использовать элемент управления WebBrowser, как я описал выше,
  • заменить приложение WinForms/WPF веб-приложением или
  • свяжитесь с Twitch, чтобы запросить использование потока паролей (который, по-видимому, не требует перенаправления), и используйте его вместо этого.
Другие вопросы по тегам