web-dev-qa-db-fra.com

Ajout d'une autorisation aux en-têtes

J'ai le code suivant:

...
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 réponse = attendre la partie continue juste une boucle en cours et rien ne se passe. Des idées sur ce que je fais mal?

La question est vraiment de savoir comment envoyer l'en-tête suivant:

Authorization: OAuth2 ACCESS_TOKEN

vers une API Web externe

22
Jimmyt1988

Cette ligne

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

Produira cette valeur d'en-tête

Authorization: ACCESS_TOKEN

ACCESS_TOKEN est la valeur de authValue.Parameter. Vous souhaitez attribuer la valeur que vous avez transmise à la place pour obtenir l'en-tête requis

client.DefaultRequestHeaders.Authorization = authValue;

Produira

Authorization: OAuth2 ACCESS_TOKEN
21
Alaa Masoud

J'ai eu du mal avec ça. J'ai continué à recevoir une erreur disant "format invalide" car j'ai une implémentation personnalisée et l'en-tête d'autorisation est validé par rapport à certaines normes. L'ajout de l'en-tête de cette façon a cependant fonctionné:

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

J'ai eu un problème similaire lors de l'obtention d'AuthenticationHeaderValue pour fonctionner avec mes demandes. J'utilisais également JWT JsonWebToken de GitHub. J'ai pu obtenir un jeton de l'API, mais j'avais du mal à l'utiliser dans d'autres GET et POST.

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

Utilisation manuelle de WebRequest: qui a bien fonctionné.

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

Lorsque nous sommes passés à un HttpClient et avons utilisé AuthenticationHeaderValue, nous n'avons pas pu comprendre comment le configurer correctement. Joué avec les paramètres, et cela a finalement fonctionné.

 var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);
6
Yogurt The Wise

Peut-être intéressant pour d'autres personnes. Depuis que je cherchais ça depuis longtemps. Mais vous devez également enregistrer vos cookies et les transmettre à votre prochaine demande. Tout d'abord, c'est ainsi que j'ai obtenu mon code d'authentification et que mes cookies sont stockés dans une variable statique (la première fois que j'appelle cette méthode, je donne une valeur vide au jeton).

    public static CookieContainer CookieContainer;
    public static async Task<string> Post<TRequest>( TRequest requestBody, string path, string token = "")
    {
        var baseUrl = new Uri($"urlFromApi");
        CookieContainer = new CookieContainer();
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
            using(var client = new HttpClient(handler){BaseAddress = baseUrl})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(String.Empty, content);
                return await GetResponseContent(response);
            }
        }

    }

Après cela, si je fais une demande à l'API, j'inclus les cookies (le jeton est ce que vous obtenez à la suite de la première réponse).

        var baseUrl = $"https://innoviris-ai.collibra.com/rest/2.0{path}";
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
        using (var client = new HttpClient(handler) {BaseAddress = new Uri(baseUrl)})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute     

            var response = await client.GetAsync(String.Empty);
            return await GetResponseContent(response);
        }
    }
2
Nico