获取错误400:通过Twitch.tv api进行身份验证时出现错误请求

本文关键字:身份验证 请求 错误 api 取错误 通过 tv Twitch 获取 | 更新日期: 2023-09-27 18:29:41

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

获取错误400:通过Twitch.tv api进行身份验证时出现错误请求

我觉得这段代码不对:

    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编码,而是对可能包含字母和数字以外的字符的参数值进行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);
    // ...

这样,远程服务器仍然可以看到&=字符,因此可以提取参数名称和值。因为我们已经对客户端ID、客户端机密、URL和代码进行了URL编码,所以它们包含的任何可能在URL中有意义的字符都不会有这种意义,并且将由远程服务器按预期接收。

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


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

OAuth身份验证就是这样工作的:

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

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

RichTextBox控件的存在,以及您对代码是"小型C#应用程序"的评论,让我认为您的代码是Windows窗体或WPF应用程序。如果是这种情况,那么您将需要:

  • 使用如上所述的WebBrowser控件
  • 用web应用程序替换WinForms/WPF应用程序,或者
  • 联系Twitch请求使用密码流(似乎不需要重定向),然后使用它