2015-10-03 11 views
5

sto cercando di ottenere token di portatore:Ottenere portatore provvisoria utilizzando 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); 
} 

Questo mi sta dando il seguente errore 403 'Forbidden'. Qualsiasi idea sarebbe apprezzata.

+0

Stai invocando 'autenticazione OAuth2' con l'autenticazione di portatore "di base"? Non sono sicuro che volerà. –

+0

Sicuro che volerà. Ecco come funziona l'autenticazione [solo app] di Twitter (https://dev.twitter.com/oauth/application-only). –

+0

Corretto, sto usando l'autenticazione solo per app. Tuttavia, continua a darmi quel dannato errore 403. –

risposta

7

Sono riuscito a farlo funzionare. Ho cambiato un paio di cose nel codice qui sopra. Il primo è l'impostazione ContentType

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

Second è uno molto piccolo dettaglio mi mancava, abbassando il caso della stringa Basic nell'intestazione Authorization.

Ecco il metodo completo nel caso in cui chiunque avrebbe bisogno:

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

Considero che il commento sull'abbassare il caso di 'Basic' non sia effettivamente fatto nel codice di esempio? – Maslow

+0

questo può essere fatto anche con parametri aggiuntivi in ​​StringContent: new StringContent (postQuery, Encoding.UTF8, "application/x-www-form-urlencoded") –

+0

*** OAuth1 *** o *** OAuth2 *** versione? – Kiquenet

Problemi correlati