2015-10-03 17 views
5

Ich versuche Inhaber Token zu erhalten:Erhalten Bearer Token mit 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); 
} 

Dies wird mir die folgende Fehlermeldung 403 'verboten' zu geben. Irgendwelche Ideen würden geschätzt werden.

+0

Sie den Aufruf 'OAuth2' Authentifizierung mit„basic“Bearer-Authentifizierung? Nicht sicher, dass das fliegen wird. –

+0

Sicher wird es fliegen. So funktioniert Twitter [App-only-Authentifizierung] (https://dev.twitter.com/oauth/application-only). –

+0

Korrekt, ich verwende nur App-Authentifizierung. Aber es gibt mir immer noch diesen verflixten 403 Fehler. –

Antwort

7

Ich konnte das funktioniert. Ich habe ein paar Dinge im obigen Code geändert. Zuerst wird die Einstellung ContentType

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

Zweitens ist ein sehr kleines Detail, das ich verpasst haben, den Fall der Basic Zeichenfolge im Header Authorization senken.

ist die komplette Methode für den Fall, jemand es brauchen würde:

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

Ich nehme an, dass der Kommentar über das Verringern des Falls von 'Basic' nicht tatsächlich in dem Beispielcode getan wird? – Maslow

+0

Dies kann auch mit zusätzlichen Parametern in StringContent erfolgen: new StringContent (postQuery, Encoding.UTF8, "application/x-www-form-urlencoded") –

+0

*** OAuth1 *** oder *** OAuth2 *** Ausführung ? – Kiquenet

Verwandte Themen