【问题标题】:Getting Error 400: Bad request at authenticate via Twitch.tv api获取错误 400:通过 Twitch.tv api 进行身份验证时出现错误请求
【发布时间】:2025-12-05 13:20:08
【问题描述】:

我是新来的,希望有人能帮助我。我尝试连接到 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;

这是不工作的部分。它给了我错误 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(string URL) 方法。

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

【问题讨论】:

    标签: c# bad-request


    【解决方案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);
        // ...
    

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

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


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

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

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

    如果您的代码位于网络应用程序中,它将能够响应在第 3 步中重定向到的 URL。或者,您可以使用 WebBrowser 控件(Windows FormsWPF)来处理 Twitch登录,并处理Navigating 事件。如果导航到的 URL 以重定向 URL 开头,则从 URL 中获取代码,取消导航并隐藏登录 Web 浏览器控件。

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

    • 使用如上所述的 WebBrowser 控件,
    • 将您的 WinForms/WPF 应用替换为 Web 应用,或者
    • 与 Twitch 联系以请求使用 password flow(似乎不需要重定向),然后改用它。

    【讨论】:

    • 我按照你说的做。但知道我得到了 403: 禁止。但我确定那是我的 clientID 和我的 clientSecret 正确的。因为我是从我的 Twitch 频道复制的。
    • @Innoszorn:我认为这是朝着正确方向迈出的一步。服务器现在了解您的请求,但拒绝访问。您如何获得code?您能否编辑您的问题以包含get_DownLoadString 方法?另外,正如我在上一段中提到的,响应正文中是否有消息?
    • 我包含了 get_DownloadString 方法。代码部分:request.GetResponse() trigger the Exception: 403: Forbidden.
    • @Innoszorn:您的 get_DownloadString 方法根本不会获取您需要的代码。您需要 (a) 改用网络应用程序,(b) 询问 Twitch 是否可以使用密码流程,或 (c) 看看您是否可以使用 WebBrowser 控件显示登录页面并使用 @ 处理重定向987654340@ 活动。请参阅我的更新答案。很抱歉没有更早地看到你正在做的事情的“大局”:如果我早点意识到我可能会为你节省一些时间。
    • 感谢您的回答。我会试试看。
    最近更新 更多