Adding authorization to the headers

前端 未结 5 1351
悲&欢浪女
悲&欢浪女 2020-12-09 03:03

I have the following code:

...
AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue(\"OAuth2\", Contract.AccessToken);
string result = await         


        
相关标签:
5条回答
  • 2020-12-09 03:20

    Had a similar issue when getting AuthenticationHeaderValue to work with my requests. I was also using JWT JsonWebToken from GitHub. I was able to get a token from the API, but was struggling to use it in other GETs and POSTs.

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

    Manually using WebRequest: Which worked fine.

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

    When we switched to an HttpClient, and used the AuthenticationHeaderValue, could not figure out how to set it up correctly.After looking at the request string, i saw it added the "Authorization" for me. Played around with parameters, and this finally this worked.

     var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);
    
    0 讨论(0)
  • 2020-12-09 03:20

    Maybe intresting for other people. Since I searched on this for a long time. But you have to save your cookies also and give it with your next request. First this is how i got my authentication code and hold my cookies in a static variable (in the first time i call this method I give an empty value to token).

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

    After this if I do any request to the api I include the cookies (token is what you get from the first response as a result) public static async Task Get(string path, string token = "") {

            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);
            }
        }
    
    0 讨论(0)
  • 2020-12-09 03:22

    I struggled with this. I kept getting an error saying "invalid format" because I have a custom implementation and the Authorization header is validated against certain standards. Adding the header this way however worked:

    var http = new HttpClient();
    http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
    
    0 讨论(0)
  • 2020-12-09 03:30

    In your code you are doing this:

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
    

    I think the following should work the same manner without using string interpolation:

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    

    This is because the string interpolation is just generating a string with the token in it!

    0 讨论(0)
  • 2020-12-09 03:46

    This line

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

    Will produce this header value

    Authorization: ACCESS_TOKEN
    

    Where ACCESS_TOKEN is the value of authValue.Parameter. You want to assign the value you passed instead to get the required header

    client.DefaultRequestHeaders.Authorization = authValue;
    

    Will produce

    Authorization: OAuth2 ACCESS_TOKEN
    
    0 讨论(0)
提交回复
热议问题