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

C# 获取错误400:通过Twitch.tv api进行身份验证时请求错误,c#,bad-request,C#,Bad Request,我是新来的,希望有人能帮助我。我尝试连接到twitch.tv我正在尝试使用一个小C#程序在twitch.tv上获得oauth2身份验证。我使用的是我的C代码: 这是不起作用的部分。它给了我错误400:Bad请求 WebRequest request = WebRequest.Create("https://api.twitch.tv/kraken/oauth2/token"); request.Method = "POST"; string postData = "cli

我是新来的,希望有人能帮助我。我尝试连接到twitch.tv我正在尝试使用一个小C#程序在twitch.tv上获得oauth2身份验证。我使用的是我的C代码:

这是不起作用的部分。它给了我错误400:Bad请求

    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(stringurl)方法


我觉得这段代码不合适:

    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);
    // ...
您正在对整个post数据字符串进行URL编码。这可以将post数据中的
&
=
符号分别转换为
%26
%3d
。当远程服务器收到此数据时,它将在其中进行扫描,查找
&
=
符号,以分离出参数名称和值。当然,它找不到任何参数,因此它将假定您有一个没有值的大参数名。服务器可能希望您尝试发送的六个参数中的每一个都有值,但没有看到任何参数的值,这可能就是您收到400错误请求错误的原因

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个错误的请求错误响应,请尝试读取响应流的内容,该响应流是通过对响应调用
GetResponseStream()
获得的。这通常会包含一条信息,帮助您找出问题所在


在仔细查看代码之后,您似乎对OAuth身份验证的工作原理有误解。您的
getDownload\u String
方法将无法获取所需的访问代码,它将只获取Twitch登录页面的HTML文本

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

  • 您的应用程序将用户发送到登录URL,以允许用户登录到Twitch
  • 在web浏览器中,用户然后输入其登录凭据并将页面提交给Twitch
  • 然后,Twitch API通过将用户的web浏览器重定向到重定向URL来响应,并附加代码。然后,您的web应用程序从URL中读取此代码
  • 如果您的代码在web应用程序中,它将能够响应在步骤3中重定向到的URL。或者,您可以使用WebBrowser控件(,)来处理Twitch登录,并处理
    导航
    事件。如果要导航到的URL以重定向URL开头,请从URL中提取代码,取消导航并隐藏登录web浏览器控件

    出现一个RichTextBox控件,再加上您对代码是“小型C#应用程序”的评论,让我认为您的代码是Windows窗体或WPF应用程序。如果是这种情况,则您需要:

    • 使用如上所述的WebBrowser控件
    • 将WinForms/WPF应用替换为web应用,或
    • 与Twitch联系,请求使用(似乎不需要重定向),然后使用

    我照你说的做。但我知道我得到了403:禁止。但我确信这是我的客户ID和客户机密。因为我是从我的Twitch频道复制的。@Innoszorn:我认为这是朝着正确方向迈出的一步。服务器现在理解您的请求,但拒绝访问。您如何获得
    code
    ?请编辑您的问题,将
    get\u DownLoadString
    方法包括在内,好吗?另外,正如我在最后一段中提到的,响应体中是否有消息?我包括了get_DownloadString方法。代码部分:request.GetResponse()触发异常:403:禁止。@Innoszorn:yourget\u DownloadString方法根本无法获取所需的代码。您需要(a)改用web应用程序,(b)询问Twitch是否可以使用密码流,或者(c)查看是否可以使用WebBrowser控件显示登录页面并使用
    导航
    事件处理重定向。请参阅我的最新答案。为没有早点看到你正在做的事情而道歉:如果我早点意识到我可能会为你节省一些时间。谢谢你的回答。我会试试看。
        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);
        // ...
    
        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);
        // ...