收到错误 400:通过 Twitch.tv api 进行身份验证时请求错误
Getting Error 400: Bad request at authenticate via Twitch.tv api
我是新来的,希望有人能帮助我。我尝试连接到 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;
这是不起作用的部分。它给了我 Error 400: Bad Request.
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;
}
}
我觉得这段代码不对:
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-encoding整个post-data字符串。这具有将 post 数据中的 &
和 =
符号分别转换为 %26
和 %3d
的效果。当远程服务器收到此数据时,它将扫描它以查找 &
和 =
符号以分离出参数名称和值。当然,它不会找到任何参数,因此它会假定您有一个没有值的大参数名称。服务器可能期待您尝试发送的六个参数中的每一个的值,但看到其中 none 个值,这可能就是您收到 400 Bad Request 错误的原因。
而不是 URL-encoding 整个字符串,URL-encode 参数值可能包含字母和数字以外的字符。我会尝试以下方法:
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);
// ...
这样,远程服务器仍会看到 &
和 =
字符,因此能够提取参数名称和值。因为我们已经 URL-encoded 客户端 ID、客户端密码、URL 和代码,所以它们包含的任何在 URL 中可能有意义的字符都没有那个含义,并且将被预期的远程服务器。
此外,如果您仍然收到 400 Bad Request 错误响应,请尝试读取通过对响应调用 GetResponseStream()
获得的响应流的内容。通常,其中会包含一条消息,可帮助您找出问题所在。
仔细查看了您的代码,您似乎对 OAuth 身份验证的工作原理有误解。您的 getDownload_String
方法不会获得您想要的访问代码,它只会获得 Twitch 登录页面的 HTML 文本。
这是 OAuth 身份验证的工作原理:
- 您的应用将用户发送到登录页面 URL,以允许用户登录 Twitch。
- 然后用户在网络浏览器中输入他们的登录凭据并将页面提交到 Twitch。
- Twitch API 然后通过将用户的 Web 浏览器重定向到重定向 URL 来响应,并附加代码。然后,您的网络应用程序会从 URL.
中读取此代码
如果您的代码在网络应用程序中,它将能够响应在步骤 3 中重定向到的 URL。或者,您可以使用 WebBrowser 控件 (Windows Forms, WPF)处理 Twitch 登录,并处理 Navigating
事件。如果导航到的 URL 以重定向 URL 开头,请从 URL 中获取代码,取消导航并隐藏登录 web-browser 控件。
似乎是 RichTextBox 控件的存在,以及您关于您的代码是 'small C# application' 的评论,让我认为您的代码是 Windows 表单或 WPF 应用程序。如果是这种情况,那么您将需要:
- 使用我上面描述的 WebBrowser 控件,
- 用网络应用替换您的 WinForms/WPF 应用,或者
- 联系 Twitch 请求使用 password flow(似乎不需要重定向),然后改用它。
我是新来的,希望有人能帮助我。我尝试连接到 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;
这是不起作用的部分。它给了我 Error 400: Bad Request.
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;
}
}
我觉得这段代码不对:
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-encoding整个post-data字符串。这具有将 post 数据中的 &
和 =
符号分别转换为 %26
和 %3d
的效果。当远程服务器收到此数据时,它将扫描它以查找 &
和 =
符号以分离出参数名称和值。当然,它不会找到任何参数,因此它会假定您有一个没有值的大参数名称。服务器可能期待您尝试发送的六个参数中的每一个的值,但看到其中 none 个值,这可能就是您收到 400 Bad Request 错误的原因。
而不是 URL-encoding 整个字符串,URL-encode 参数值可能包含字母和数字以外的字符。我会尝试以下方法:
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);
// ...
这样,远程服务器仍会看到 &
和 =
字符,因此能够提取参数名称和值。因为我们已经 URL-encoded 客户端 ID、客户端密码、URL 和代码,所以它们包含的任何在 URL 中可能有意义的字符都没有那个含义,并且将被预期的远程服务器。
此外,如果您仍然收到 400 Bad Request 错误响应,请尝试读取通过对响应调用 GetResponseStream()
获得的响应流的内容。通常,其中会包含一条消息,可帮助您找出问题所在。
仔细查看了您的代码,您似乎对 OAuth 身份验证的工作原理有误解。您的 getDownload_String
方法不会获得您想要的访问代码,它只会获得 Twitch 登录页面的 HTML 文本。
这是 OAuth 身份验证的工作原理:
- 您的应用将用户发送到登录页面 URL,以允许用户登录 Twitch。
- 然后用户在网络浏览器中输入他们的登录凭据并将页面提交到 Twitch。
- Twitch API 然后通过将用户的 Web 浏览器重定向到重定向 URL 来响应,并附加代码。然后,您的网络应用程序会从 URL. 中读取此代码
如果您的代码在网络应用程序中,它将能够响应在步骤 3 中重定向到的 URL。或者,您可以使用 WebBrowser 控件 (Windows Forms, WPF)处理 Twitch 登录,并处理 Navigating
事件。如果导航到的 URL 以重定向 URL 开头,请从 URL 中获取代码,取消导航并隐藏登录 web-browser 控件。
似乎是 RichTextBox 控件的存在,以及您关于您的代码是 'small C# application' 的评论,让我认为您的代码是 Windows 表单或 WPF 应用程序。如果是这种情况,那么您将需要:
- 使用我上面描述的 WebBrowser 控件,
- 用网络应用替换您的 WinForms/WPF 应用,或者
- 联系 Twitch 请求使用 password flow(似乎不需要重定向),然后改用它。