2015-10-03 23 views
5

tôi đang cố gắng để có được thẻ bearer:Lấy Bearer Mã sử ​​dụng HttpClient

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

này đem lại cho tôi những lỗi sau 403 'Cấm'. Có những câu chuyện mới trên trang chủ.

+0

Bạn đang gọi 'xác thực OAuth2' với xác thực bearer "cơ bản"? Không chắc nó sẽ bay. –

+0

Chắc chắn nó sẽ bay. Đó là cách [xác thực chỉ ứng dụng] của Twitter (https://dev.twitter.com/oauth/application-only) hoạt động. –

+0

Đúng, tôi đang sử dụng xác thực chỉ dành cho ứng dụng. Tuy nhiên, nó vẫn cho tôi rằng lỗi 403 darn. –

Trả lời

7

Tôi có thể làm việc này. Tôi đã thay đổi một vài điều trong đoạn mã trên. Đầu tiên là thiết lập các ContentType

requestToken.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded") {CharSet = "UTF-8"}; 

Thứ hai là một chi tiết rất nhỏ tôi đã bỏ lỡ, hạ trường hợp của Basic chuỗi trong Authorization tiêu đề.

Dưới đây là phương pháp hoàn chỉnh chỉ trong trường hợp bất cứ ai cần đến nó:

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

} 
+0

Tôi nhận thấy rằng nhận xét về việc giảm trường hợp của 'Basic' không thực sự được thực hiện trong mã mẫu? – Maslow

+0

điều này cũng có thể được thực hiện với các tham số bổ sung trong StringContent: mới StringContent (postQuery, Encoding.UTF8, "ứng dụng/x-www-form-urlencoded") –

+0

*** OAuth1 *** hoặc *** OAuth2 *** phiên bản ? – Kiquenet

Các vấn đề liên quan