web-dev-qa-db-ja.com

ヘッダーに承認を追加する

私は次のコードを持っています:

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

Response = await部分は、進行中のループを継続するだけで、何も起こりません。私が間違っていることは何ですか?

問題は、次のヘッダーをどのように送信するかです。

Authorization: OAuth2 ACCESS_TOKEN

外部Web APIへ

22
Jimmyt1988

この行

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

このヘッダー値を生成します

Authorization: ACCESS_TOKEN

ここで、ACCESS_TOKENauthValue.Parameterの値です。代わりに、必要なヘッダーを取得するために渡した値を割り当てたい

client.DefaultRequestHeaders.Authorization = authValue;

生産します

Authorization: OAuth2 ACCESS_TOKEN
21
Alaa Masoud

私はこれに苦労しました。カスタム実装を使用しており、Authorizationヘッダーが特定の標準に対して検証されているため、「無効な形式」というエラーが引き続き表示されます。ただし、この方法でヘッダーを追加しても機能しました。

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

AuthenticationHeaderValueをリクエストで機能させるときに同様の問題がありました。 GitHubのJWT JsonWebTokenも使用していました。 APIからトークンを取得できましたが、他のGETやPOSTでトークンを使用するのに苦労していました。

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

WebRequestを手動で使用する:これはうまくいきました。

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

HttpClientに切り替えてAuthenticationHeaderValueを使用すると、正しく設定する方法がわかりませんでした。リクエスト文字列を見ると、「Authorization」が追加されているのがわかりました。パラメータをいじってみたところ、これが最終的に機能しました。

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

たぶん他の人のために興味をそそられる。私はこれを長い間探していたので。ただし、Cookieも保存して、次のリクエストで提供する必要があります。最初にこれは、認証コードを取得し、Cookieを静的変数に保持する方法です(このメソッドを最初に呼び出すときに、トークンに空の値を渡します)。

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

    }

この後、apiにリクエストを行う場合、cookieを含めます(トークンは結果として最初の応答から取得します)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);
        }
    }
2
Nico