إضافة التفويض إلى الرؤوس

سئل على ٢٦ سبتمبر ٢٠١٣  ·  تمت مشاهدة 79k مرة  ·  مصدر

Jimmyt1988 picture
في ٢٦ سبتمبر ٢٠١٣

لدي الكود التالي:

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

الاستجابة = جزء الانتظار يستمر في حلقة مستمرة ولا يحدث شيء. أي أفكار عما أفعله خطأ؟

السؤال هو كيف أرسل الرأس التالي:

Authorization: OAuth2 ACCESS_TOKEN

إلى واجهة ويب خارجية

الإجابات

John picture
في ٤ يوليو ٢٠١٤
61

لقد كافحت مع هذا. ظللت أتلقى خطأ يقول "تنسيق غير صالح" لأن لدي تنفيذًا مخصصًا وتم التحقق من صحة عنوان التفويض وفقًا لمعايير معينة. إضافة الرأس بهذه الطريقة نجحت على الرغم من ذلك:

var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
Alaa Masoud picture
في ٢٧ سبتمبر ٢٠١٣
25

هذا الخط

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

سينتج قيمة الرأس هذه

Authorization: ACCESS_TOKEN

حيث ACCESS_TOKEN هي قيمة authValue.Parameter . تريد تعيين القيمة التي مررتها بدلاً من ذلك للحصول على الرأس المطلوب

client.DefaultRequestHeaders.Authorization = authValue;

سوف ينتج

Authorization: OAuth2 ACCESS_TOKEN
Yogurt The Wise picture
في ٢٠ ديسمبر ٢٠١٧
8

واجهت مشكلة مماثلة عند الحصول على AuthenticationHeaderValue للعمل مع طلباتي. كنت أستخدم أيضًا JWT JsonWebToken من GitHub. تمكنت من الحصول على رمز مميز من API ، لكنني كنت أعاني من أجل استخدامه في GETs و POSTs الأخرى.

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 ، لم نتمكن من معرفة كيفية إعداده بشكل صحيح. بعد النظر في سلسلة الطلب ، رأيت أنها أضافت "التفويض" بالنسبة لي. تم التلاعب بالمعلمات ، وقد نجح هذا أخيرًا.

 var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);
Nico picture
في ٢٤ مارس ٢٠١٩
2

ربما تكون مثيرة للاهتمام لأشخاص آخرين. منذ أن بحثت عن هذا لفترة طويلة. ولكن عليك أيضًا حفظ ملفات تعريف الارتباط الخاصة بك وتقديمها مع طلبك التالي. أولاً ، هذه هي الطريقة التي حصلت بها على رمز المصادقة الخاص بي وأحتفظ بملفات تعريف الارتباط الخاصة بي في متغير ثابت (في المرة الأولى التي أتصل فيها بهذه الطريقة ، أعطي قيمة فارغة للرمز المميز).

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

    }

بعد ذلك ، إذا قمت بأي طلب لواجهة برمجة التطبيقات ، فقم بتضمين ملفات تعريف الارتباط (الرمز المميز هو ما تحصل عليه من الاستجابة الأولى نتيجة لذلك) الحصول على مهمة عامة ثابتة غير متزامنة (مسار سلسلة ، رمز سلسلة = "") {

        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);
        }
    }
Ajit Menon picture
في ٨ سبتمبر ٢٠٢٠
1

في التعليمات البرمجية الخاصة بك تقوم بما يلي:

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

أعتقد أن ما يلي يجب أن يعمل بنفس الطريقة دون استخدام استيفاء السلسلة:

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

هذا لأن استيفاء السلسلة يقوم فقط بإنشاء سلسلة مع الرمز المميز بداخلها!