我是新来的,我希望有人可以帮助我。我尝试连接到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(字符串URL)方法。
private static string get_DownLoadString(string URL)
{
try
{
string temp = (new WebClient().DownloadString(URL));
return temp;
}
catch (WebException)
{
return null;
}
}
答案 0 :(得分:2)
此代码对我来说并不合适:
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身份验证的工作原理:
如果您的代码位于Web应用程序中,则它将能够响应在步骤3中重定向到的URL。或者,您可以使用WebBrowser控件(Windows Forms,WPF)处理Twitch登录,并处理Navigating
事件。如果要导航的URL以重定向URL开头,请从URL中获取代码,取消导航并隐藏登录Web浏览器控件。
RichTextBox控件的存在以及您对代码作为小型C#应用程序的评论使我认为您的代码是Windows窗体或WPF应用程序。如果是这种情况,那么您需要: