收到错误 400:通过 Twitch.tv api 进行身份验证时请求错误

Getting Error 400: Bad request at authenticate via Twitch.tv api

我是新来的,希望有人能帮助我。我尝试连接到 twitch.tv 我正在尝试使用小型 C# 程序在 twitch.tv 上获得 oauth2 身份验证。我正在使用 twitch.tv authentication request. 这是我的 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;

这是不起作用的部分。它给了我 Error 400: Bad Request.

    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(string URL) 方法。

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

我觉得这段代码不对:

    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-encoding整个post-data字符串。这具有将 post 数据中的 &= 符号分别转换为 %26%3d 的效果。当远程服务器收到此数据时,它将扫描它以查找 &= 符号以分离出参数名称和值。当然,它不会找到任何参数,因此它会假定您有一个没有值的大参数名称。服务器可能期待您尝试发送的六个参数中的每一个的值,但看到其中 none 个值,这可能就是您收到 400 Bad Request 错误的原因。

而不是 URL-encoding 整个字符串,URL-encode 参数值可能包含字母和数字以外的字符。我会尝试以下方法:

    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-encoded 客户端 ID、客户端密码、URL 和代码,所以它们包含的任何在 URL 中可能有意义的字符都没有那个含义,并且将被预期的远程服务器。

此外,如果您仍然收到 400 Bad Request 错误响应,请尝试读取通过对响应调用 GetResponseStream() 获得的响应流的内容。通常,其中会包含一条消息,可帮助您找出问题所在。


仔细查看了您的代码,您似乎对 OAuth 身份验证的工作原理有误解。您的 getDownload_String 方法不会获得您想要的访问代码,它只会获得 Twitch 登录页面的 HTML 文本。

这是 OAuth 身份验证的工作原理:

  1. 您的应用将用户发送到登录页面 URL,以允许用户登录 Twitch。
  2. 然后用户在网络浏览器中输入他们的登录凭据并将页面提交到 Twitch。
  3. Twitch API 然后通过将用户的 Web 浏览器重定向到重定向 URL 来响应,并附加代码。然后,您的网络应用程序会从 URL.
  4. 中读取此代码

如果您的代码在网络应用程序中,它将能够响应在步骤 3 中重定向到的 URL。或者,您可以使用 WebBrowser 控件 (Windows Forms, WPF)处理 Twitch 登录,并处理 Navigating 事件。如果导航到的 URL 以重定向 URL 开头,请从 URL 中获取代码,取消导航并隐藏登录 web-browser 控件。

似乎是 RichTextBox 控件的存在,以及您关于您的代码是 'small C# application' 的评论,让我认为您的代码是 Windows 表单或 WPF 应用程序。如果是这种情况,那么您将需要:

  • 使用我上面描述的 WebBrowser 控件,
  • 用网络应用替换您的 WinForms/WPF 应用,或者
  • 联系 Twitch 请求使用 password flow(似乎不需要重定向),然后改用它。