【问题标题】:Obtain Bearer Token using HttpClient使用 HttpClient 获取 Bearer Token
【发布时间】:2015-12-31 14:49:25
【问题描述】:

我正在尝试获取不记名令牌:

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);
}

这给了我以下错误 403 'Forbidden'。任何想法,将不胜感激。

【问题讨论】:

  • 您正在使用“基本”不记名身份验证调用OAuth2 身份验证?不确定那会飞。
  • 肯定会飞。这就是 Twitter 的 app-only authentication 的工作原理。
  • 正确,我使用的是纯应用身份验证。但是,它一直给我那个该死的 403 错误。
  • Bearer Token ONLY 用于OAuth2 ?

标签: c# oauth dotnet-httpclient


【解决方案1】:

我能够得到这个工作。我在上面的代码中更改了几处。首先是设置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();

}

【讨论】:

  • 我认为关于降低Basic大小写的注释实际上并没有在示例代码中完成?
  • 这也可以通过 StringContent 中的附加参数来完成:new StringContent(postQuery, Encoding.UTF8, "application/x-www-form-urlencoded")
  • OAuth1 或 OAuth2 版本?
  • ConsumerKey 和 ConsumerSecret 就像 OAuth2 中的 client_id 和 client_secret ?
  • 我只是在想我们是否有 ngGet 包来获取访问令牌?
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 2014-01-02
  • 2019-11-25
  • 1970-01-01
  • 2020-05-10
  • 2023-04-03
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多