C# 使用HttpClient获取承载令牌

C# 使用HttpClient获取承载令牌,c#,oauth,dotnet-httpclient,C#,Oauth,Dotnet Httpclient,我正在尝试获取不记名代币: public override async Task<string> Post(string path, HttpContent content) { var encodedConsumerKey = System.Uri.EscapeDataString("1111111111111"); var encodedConsumerKeySecret = System.Uri.EscapeDataString("2222222222222

我正在尝试获取不记名代币:

public override async Task<string> Post(string path, HttpContent content) {


    var encodedConsumerKey = System.Uri.EscapeDataString("1111111111111");
    var encodedConsumerKeySecret = System.Uri.EscapeDataString("2222222222222");
    var encodedPair = Base64Encode(String.Format("{0}:{1}", encodedConsumerKey, encodedConsumerKeySecret));

    HttpRequestMessage request = new HttpRequestMessage{
                                        Method      = HttpMethod.Post,
                                        RequestUri  = new Uri("https://api.twitter.com/oauth2/token"),
                                        Content     = new StringContent("grant_type=client_credentials")
                                    };
    request.Headers.TryAddWithoutValidation("Authorization", String.Format("BASIC {0}", encodedPair));
    request.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");


    var result = await HttpClient.SendAsync(request);
    return result.Content.ReadAsStringAsync().Result;
}

private static string Base64Encode(string plainText) {
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}
public重写异步任务Post(字符串路径,HttpContent){
var encodedConsumerKey=System.Uri.EscapeDataString(“1111”);
var encodedConsumerKeySecret=System.Uri.EscapeDataString(“22222”);
var encodedPair=Base64Encode(String.Format(“{0}:{1}”,encodedConsumerKey,encodedConsumerKeySecret));
HttpRequestMessage请求=新建HttpRequestMessage{
方法=HttpMethod.Post,
RequestUri=新的Uri(“https://api.twitter.com/oauth2/token"),
内容=新的StringContent(“授予类型=客户端凭据”)
};
request.Headers.TryAddWithoutValidation(“Authorization”,String.Format(“BASIC{0}”,encodedPair));
request.Headers.TryAddWithoutValidation(“内容类型”、“应用程序/x-www-form-urlencoded”);
var result=wait HttpClient.sendsync(请求);
返回result.Content.ReadAsStringAsync().result;
}
专用静态字符串Base64Encode(字符串明文){
var plainTextBytes=System.Text.Encoding.UTF8.GetBytes(明文);
返回System.Convert.ToBase64String(明文字节);
}

这给了我以下错误403“禁止”。任何想法都将不胜感激

我能让它工作起来。我在上面的代码中做了一些更改。首先是设置
ContentType

requestToken.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded") {CharSet = "UTF-8"};
第二个是我遗漏的一个非常小的细节,降低了
Authorization
标题中
Basic
字符串的大小写

以下是完整的方法,以防任何人需要它:

public async Task<string> GetAPI(string apiPath)
{

var baseUri = new Uri("https://api.twitter.com/");
var encodedConsumerKey = HttpUtility.UrlEncode("111111111111");
var encodedConsumerKeySecret = HttpUtility.UrlEncode("222222222222");
var encodedPair = Base64Encode(String.Format("{0}:{1}", encodedConsumerKey, encodedConsumerKeySecret));

var requestToken = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri(baseUri, "oauth2/token"),
    Content = new StringContent("grant_type=client_credentials")
};

requestToken.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded") { CharSet = "UTF-8" };
requestToken.Headers.TryAddWithoutValidation("Authorization", String.Format("Basic {0}", encodedPair));

var bearerResult = await HttpClient.SendAsync(requestToken);
var bearerData = await bearerResult.Content.ReadAsStringAsync();
var bearerToken = JObject.Parse(bearerData)["access_token"].ToString();

var requestData = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri(baseUri, apiPath),
};
requestData.Headers.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken));

var results = await HttpClient.SendAsync(requestData);
return await results.Content.ReadAsStringAsync();

}
公共异步任务GetAPI(字符串apiPath) { var baseUri=新Uri(“https://api.twitter.com/"); var encodedConsumerKey=HttpUtility.UrlEncode(“111111”); var encodedConsumerKeySecret=HttpUtility.UrlEncode(“22222”); var encodedPair=Base64Encode(String.Format(“{0}:{1}”,encodedConsumerKey,encodedConsumerKeySecret)); var requestToken=新的HttpRequestMessage { 方法=HttpMethod.Post, RequestUri=新Uri(baseUri,“oauth2/token”), 内容=新的StringContent(“授予类型=客户端凭据”) }; requestToken.Content.Headers.ContentType=新的MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”){CharSet=“UTF-8”}; requestToken.Headers.TryAddWithoutValidation(“Authorization”,String.Format(“Basic{0}”,encodedPair)); var bearerResult=await-HttpClient.sendsync(requestToken); var bearerData=wait bearerResult.Content.ReadAsStringAsync(); var bearerToken=JObject.Parse(bearerData)[“访问令牌”].ToString(); var requestData=newhttprequestmessage { Method=HttpMethod.Get, RequestUri=新Uri(baseUri,apiPath), }; requestData.Headers.TryAddWithoutValidation(“Authorization”,String.Format(“Bearer{0}”,bearerToken)); var results=await-HttpClient.sendsync(requestData); 返回wait results.Content.ReadAsStringAsync(); }
您正在使用“基本”承载身份验证调用
OAuth2
身份验证?不确定它会飞,肯定会飞。这就是Twitter的工作原理。正确,我使用的是仅应用程序身份验证。然而,它一直给我那个该死的403错误。承载令牌只用于
OAuth2
?我认为关于降低
Basic
大小写的注释实际上没有在示例代码中完成?这也可以通过StringContent中的附加参数来完成:new StringContent(postQuery,Encoding.UTF8,“application/x-www-form-urlencoded”)OAuth1或OAuth2版本?
ConsumerKey
ConsumerCret
类似于OAuth2中的客户id和客户机密?