获取错误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;
}
}
我觉得这段代码不对:
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身份验证就是这样工作的:
- 您的应用程序将用户发送到登录URL,以允许用户登录Twitch
- 然后,用户在网络浏览器中输入登录凭据,并将页面提交给Twitch
- 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请求使用密码流(似乎不需要重定向),然后使用它