C# 获取错误400:通过Twitch.tv api进行身份验证时请求错误
我是新来的,希望有人能帮助我。我尝试连接到twitch.tv我正在尝试使用一个小C#程序在twitch.tv上获得oauth2身份验证。我使用的是我的C代码: 这是不起作用的部分。它给了我错误400:Bad请求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
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以重定向URL开头,请从URL中提取代码,取消导航并隐藏登录web浏览器控件
出现一个RichTextBox控件,再加上您对代码是“小型C#应用程序”的评论,让我认为您的代码是Windows窗体或WPF应用程序。如果是这种情况,则您需要:
- 使用如上所述的WebBrowser控件
- 将WinForms/WPF应用替换为web应用,或
- 与Twitch联系,请求使用(似乎不需要重定向),然后使用
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);
// ...