【发布时间】:2022-08-12 20:58:15
【问题描述】:
我想使用带有 C# 的 twitter api 制作桌面应用程序。
在如何与 PKCE 连接之后,我已成功通过 i/oauth2/authorize api 获取授权代码。 https://developer.twitter.com/en/docs/authentication/oauth-2-0/user-access-token
但是 step3, 2/oauth2/token 总是返回错误。 错误是“invalid_request”和“为令牌传递的值无效。”
有人知道我的代码有错误吗?
using System.Diagnostics;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web;
public async Task Authorize()
{
var state = GenerateRandomString(inLength: 200);
var codeVerifier = GenerateRandomString(inLength: 100);
var challenge = codeVerifier;
//var challenge = GenerateCodeS256Challenge(codeVerifier);
var challengeMethod = \"plain\";
var scope = \"tweet.read tweet.write users.read offline.access\".Replace(\" \", \"%20\");
var url = \"https://twitter.com/i/oauth2/authorize\";
url = $\"{url}?response_type=code&client_id={ClientID}&redirect_uri={RedirectUrl}&scope={scope}&state={state}&code_challenge={challenge}&code_challenge_method={challengeMethod}\";
var http = new HttpListener();
http.Prefixes.Add(RedirectUrl);
http.Start();
Process.Start(new ProcessStartInfo
{
FileName = url,
UseShellExecute = true,
});
var context = await http.GetContextAsync();
var httpResponse = context.Response;
var buffer = Encoding.UTF8.GetBytes(\"<html><body>Please return to the app.</body></html>\");
httpResponse.ContentLength64 = buffer.Length;
var responseOutput = httpResponse.OutputStream;
await responseOutput.WriteAsync(buffer, 0, buffer.Length);
responseOutput.Close();
http.Stop();
if (context.Request.QueryString.Get(\"state\") == state)
{
var code = context.Request.QueryString.Get(\"code\");
var request = new HttpRequestMessage(HttpMethod.Post, \"https://api.twitter.com/2/oauth2/token\");
//request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
// \"Basic\",
// Convert.ToBase64String(Encoding.ASCII.GetBytes($\"{ClientID}:{ClientSecret}\"))
// );
request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ \"code\", code },
{ \"grant_type\", \"authorization_code\" },
{ \"client_id\", ClientID },
{ \"redirect_url\", RedirectUrl},
{ \"code_verifier\", codeVerifier },
});
// status code: 400, Bad Request
var response = await _httpClient.SendAsync(request);
// {
// \"error\":\"invalid_request\",
// \"error_description\":\"Value passed for the token was invalid.\"
// }
var json = await response.Content.ReadAsStringAsync();
}
}
标签: c# twitter twitter-oauth