[C#] HttpClient의 인증 헤더 설정

REST API에 사용하는 HttpClient가 있습니다. 그러나 인증 헤더를 설정하는 데 문제가 있습니다. OAuth 요청을 통해받은 토큰으로 헤더를 설정해야합니다. 다음을 제안하는 .NET 코드가 있습니다.

httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token);

그러나 Credential 클래스는 WinRT에 존재하지 않습니다. 누구나 승인 헤더를 설정하는 방법에 대한 아이디어가 있습니까?



답변

이를 수행하는 방법은 다음과 같습니다.

httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "Your Oauth token");


답변

request.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue(
        "Basic", Convert.ToBase64String(
            System.Text.ASCIIEncoding.ASCII.GetBytes(
               $"{yourusername}:{yourpwd}")));


답변

이 문제를 해결하는 좋은 방법을 찾고 있으며 같은 질문을보고 있습니다. 이 답변이 같은 문제를 가진 모든 사람들이 나를 좋아하도록 도울 수 있기를 바랍니다.

using (var client = new HttpClient())
{
    var url = "https://www.theidentityhub.com/{tenant}/api/identity/v1";
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
    var response = await client.GetStringAsync(url);
    // Parse JSON response.
    ....
}

https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi 에서 참조


답변

성능 및 포트 소진 문제에 대해 HttpClient 인스턴스를 재사용 하는 것이 좋습니다. 이 답변을 제공하는 답변이 없기 때문에 (그리고 나쁜 습관으로 이어질 수도 있습니다 :()) 여기에 내가 작성한 답변에 대한 링크를 넣었습니다. 비슷한 질문에 :

https://stackoverflow.com/a/40707446/717372

HttpClient를 올바르게 사용하는 방법에 대한 일부 소스 :


답변

TheWhiteRabbit의 답변에 동의하지만 HttpClient를 사용하여 많은 호출을하면 코드가 약간 반복적이라고 생각합니다.

나는 대답을 조금 향상시키는 두 가지 방법이 있다고 생각합니다.

클라이언트를 작성하기위한 헬퍼 클래스를 작성하십시오.

public static class ClientHelper
{
    // Basic auth
    public static HttpClient GetClient(string username,string password)
    {
            var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));

            var client = new HttpClient(){
                DefaultRequestHeaders = { Authorization = authValue}
                //Set some other client defaults like timeout / BaseAddress
            };
            return client;
    }

    // Auth with bearer token
    public static HttpClient GetClient(string token)
    {
            var authValue = new AuthenticationHeaderValue("Bearer", token);

            var client = new HttpClient(){
                DefaultRequestHeaders = { Authorization = authValue}
                //Set some other client defaults like timeout / BaseAddress
            };
            return client;
    }
}

용법:

using(var client = ClientHelper.GetClient(username,password))
{
    //Perform some http call
}

using(var client = ClientHelper.GetClient(token))
{
    //Perform some http call
}

확장 메소드를 작성하십시오.

뷰티 상을 수상하지는 않지만 훌륭하게 작동합니다. 🙂

    public static class HttpClientExtentions
    {
        public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
        {
            return new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(
            System.Text.Encoding.ASCII.GetBytes(
                $"{username}:{password}")));
        }
    }

용법:

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password);
}

다시 한 번 위의 2 가지 옵션을 사용하면 클라이언트가 명령문을 조금 덜 반복적으로 사용할 수 있다고 생각합니다. http 호출을 여러 번 수행하는 경우 HttpClient를 재사용하는 것이 가장 좋은 방법이지만이 질문의 범위를 벗어난 것으로 생각합니다.


답변

무기명 토큰을 설정하고있었습니다

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

한 엔드 포인트에서는 작동했지만 다른 엔드 포인트에서는 작동하지 않았습니다. 문제는에 소문자가 있다는 것 b입니다 "bearer". 변경 후 이제 두 API 모두에서 작동합니다. 바늘을 찾기 위해 건초 더미 중 하나로 간주하지 않는다면 놓치기 쉬운 것입니다.

"Bearer"자본 이 있어야 합니다.


답변

나는 당신에게 제안합니다 :

HttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");

그런 다음 다음과 같이 사용할 수 있습니다.

var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
    responseMessage = await response.Content.ReadAsAsync<ResponseMessage>();
}