Socket.io-client: طريقة المصافحة السيئة (فقط عند استخدام رؤوس إضافية!)

تم إنشاؤها على ٢٣ يونيو ٢٠١٧  ·  13تعليقات  ·  مصدر: socketio/socket.io-client

اتريد:

  • [x] أبلغ عن خطأ
  • [] طلب ميزة

السلوك الحالي

أحصل على 400 مع الرسالة {"code":2,"message":"Bad handshake method"} عند محاولة توصيل خادمي برأس إضافي (يعمل بشكل جيد إذا لم أحاول إضافته).

خطوات إعادة الإنتاج (إذا كان السلوك الحالي خطأ)

أحاول توصيل خادمي بالتكوين التالي:

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

لقد لاحظت أيضًا أنه يتم إجراء طلب OPTIONS عندما أقوم بإضافة هذا الرأس الإضافي (بدلاً من GET عندما لا أقوم بإضافته)

سلوك متوقع

طلب الحصول على GET (للاحتفاظ بملفات تعريف الارتباط) مع الرؤوس الإضافية التي لا تكسر الاتصال.

يثبت

  • نظام التشغيل: Mac
  • المتصفح: Chrome 58
  • الإصدار socket.io: 2.0.3

التعليق الأكثر فائدة

مرحبا! أعتقد أنه يجب عليك إضافة الرؤوس المناسبة على جانب الخادم (يبدو أنك في موقف CORS):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

أضفت مثالاً هناك: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

ال 13 كومينتر

نفس المشكلة ، هنا .. تعمل بشكل كامل مع إصدار nodejs من socket.io-client وليس المتصفح

  • نظام التشغيل: Win
  • المتصفح: Chrome 59
  • الإصدار socket.io: 2.0.3

مرحبا! أعتقد أنه يجب عليك إضافة الرؤوس المناسبة على جانب الخادم (يبدو أنك في موقف CORS):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

أضفت مثالاً هناك: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

darrachequesne كيفية تحديد مجالات متعددة للأصل ، الطرق التالية لا تعمل:

  1. "Access-Control-Allow-Origin": " http: // localhost : 3001، http: // localhost : 3002"
  2. "Access-Control-Allow-Origin": [' http: // localhost : 3001، http: // localhost : 3002']
  3. "Access-Control-Allow-Origin": " http: // localhost : 3001 http: // localhost : 3002"

DaVincii لا يمكنك استخدام مجالات متعددة ، تحتاج إلى قراءة أصل رأس العميل والتحقق مرة أخرى من القائمة البيضاء الخاصة بك.

رؤية هذا وهذا على تدفق المداخن

تم تعريف

رؤوس ثابتة = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"Access-Control-Allow-Origin": null ،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛

لاستخدام كورس
{
handlePreflightRequest: function (req، res) {
رؤوس var = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"التحكم في الوصول ، السماح بالأصل": req.headers.origin،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛
res.writeHead (200 ، رؤوس) ؛
إعادة إرسال()؛
}
}

لاستخدام كورس
{
handlePreflightRequest: function (req، res) {
رؤوس var = {
"التحكم في الوصول والسماح بالعناوين": "نوع المحتوى ، التخويل" ،
"التحكم في الوصول ، السماح بالأصل": req.headers.origin،
"التحكم في الوصول والسماح ببيانات الاعتماد": صحيح
} ؛
res.writeHead (200 ، رؤوس) ؛
إعادة إرسال()؛
}
}

"التحكم في الوصول ، السماح بالأصل": req.headers.origin
هذا فقط أنقذ يومي! عندما استخدمت:
"Access-Control-Allow-Origin": سيعطيني الخطأ التالي:"يجب ألا تكون قيمة رأس" Access-Control-Allow-Origin "في الاستجابة هي حرف البدل" عندما يكون وضع بيانات اعتماد الطلب "include". يتم التحكم في وضع بيانات الاعتماد للطلبات التي بدأها XMLHttpRequest بواسطة السمة withCredentials . "

يبدو أن هذا لم يعد يعمل مع أحدث socket.io. المطبوع عليه لا يعجبه. على أي حال لإصلاح؟
image

يبدو أن هذا لم يعد يعمل مع أحدث socket.io. المطبوع عليه لا يعجبه. على أي حال لإصلاح؟

@ supertiger1234 handlePreflightRequest له واجهة مختلفة في الإصدار الأخير

Screenshot 2020-07-20 at 20 16 00

لذلك في حالتك يجب أن يكون:

...
handlePreflightRequest: function(server, req, res) {
  var headers = {
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
    "Access-Control-Allow-Origin": config.allowedOrigins,
    "Access-Control-Allow-Credentials": true,
  };

  res.writeHead(200, headers);
  res.end();
...

لدى @ supertiger1234 handlePreflightRequest واجهة مختلفة في الإصدار الأخير

⚠️ إذا قمت بتثبيت socket.io الآن من npm ، فسيكون لديك إصدار قديم ، ولكن إذا قمت بتثبيت كتابات (عبرtypes) ، فسيكون لها كتابة جديدة! والتي يمكن أن تكون مضللة للغاية.

كيف أقوم بتثبيت أحدث مقبس io؟

للرجوع إليها في المستقبل: تحدث هذه المشكلة أيضًا عند استخدام خادم post-3.0 مع عميل قبل 3.0. قد يكون السبب في ذلك وجود ذاكرة تخزين مؤقت خاطئة تجعل العملاء يستخدمون إصدارًا أقدم من socket.io.js .

للقراء في المستقبل ، يرجى الاطلاع على:

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات