2013-09-26 17 views
18

ho il seguente codice:Aggiungendo l'autorizzazione alle intestazioni

... 
AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue("OAuth2", Contract.AccessToken); 
string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders); 
return result; 
... 

public static async Task<string> AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue) 
{ 

    HttpClient client = new HttpClient(); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter); 

    HttpResponseMessage response = await client.PostAsync(new Uri(url), data); 

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
    response.EnsureSuccessStatusCode(); 
    string responseBody = await response.Content.ReadAsStringAsync(); 
    return responseBody; 
} 

La risposta = attendono parte solo continua un ciclo in corso e non succede nulla. Qualche idea su cosa sto facendo male?

La questione è davvero, come faccio a inviare la seguente intestazione:

Authorization: OAuth2 ACCESS_TOKEN 

a un API Web esterna

risposta

16

Questa linea

client.DefaultRequestHeaders.Authorization = 
      new AuthenticationHeaderValue(authValue.Parameter); 

produrrà questo valore intestazione

Authorization: ACCESS_TOKEN 

Dove ACCESS_TOKEN è il valore di authValue.Parameter. Si vuole assegnare il valore passato invece di ottenere l'intestazione richiesta

client.DefaultRequestHeaders.Authorization = authValue; 

Produrrà

Authorization: OAuth2 ACCESS_TOKEN 
+0

Ora posso vedere questo funziona. DefaultRequestHeaders sono impostati come dici tu. Devo presumere che, poiché non funziona, non sto inviando l'intestazione giusta, ho avuto un picco nella documentazione di OAUTH e ho visto che ha alcuni valori in più da inviare ... anche se lui api con cui sto lavorando dice esplicitamente "Bisogno di fare richieste API future con l'intestazione sopra" – Jimmyt1988

46

ho lottato con questo. Ho ricevuto un errore che diceva "formato non valido" perché ho un'implementazione personalizzata e l'intestazione di autorizzazione è convalidata rispetto a determinati standard. Tuttavia, l'aggiunta dell'intestazione in questo modo ha funzionato:

var http = new HttpClient(); 
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX"); 
+2

Oh strano, grazie per l'approccio extra. – Jimmyt1988

+0

Sebbene questa intestazione possa sembrare strana, è il formato in cui l'intestazione di autorizzazione è stata richiesta da Google Cloud Messaging Service, che a sua volta invia messaggi ai dispositivi Android. –

+0

Mi ci è voluta un'ora per ottenere questo :(. Grazie mille –

0

Si è verificato un problema simile quando si è verificato che AuthenticationHeaderValue funzionasse con le mie richieste. Stavo anche usando JWT JsonWebToken da GitHub. Sono riuscito a ottenere un token dall'API, ma ho faticato a utilizzarlo in altri GET e POST.

var jwt = JsonWebToken.Encode(token, APISECRET, JwtHashAlgorithm.HS256); 
var tk = GetTokenFromApi(); // basically returns an encrypted string. 

utilizzando manualmente WebRequest: che funzionava bene.

request.ContentType = "application/json"; 
request.Method = "POST"; 
request.Headers.Set("Authorization", string.Format("Bearer {0}", tk)); 

Quando siamo passati a un HttpClient, e abbiamo usato l'AuthenticationHeaderValue, non riusciva a capire come configurarlo correctly.After guardando la stringa di richiesta, l'ho visto ha aggiunto la "autorizzazione" per me. Giocato con parametri, e questo finalmente ha funzionato.

var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk); 
Problemi correlati