Socket.io-client: Metode jabat tangan yang buruk (hanya saat menggunakan tajuk tambahan!)

Dibuat pada 23 Jun 2017  ·  13Komentar  ·  Sumber: socketio/socket.io-client

Yang kamu ingin:

  • [x] laporkan bug
  • [ ] meminta fitur

Perilaku saat ini

Saya mendapatkan 400 dengan pesan {"code":2,"message":"Bad handshake method"} ketika mencoba menghubungkan server saya dengan header tambahan (berfungsi dengan baik jika saya tidak mencoba menambahkannya).

Langkah-langkah untuk mereproduksi (jika perilaku saat ini adalah bug)

Saya mencoba menghubungkan server saya dengan konfigurasi berikut:

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

Saya juga memperhatikan bahwa permintaan OPSI dibuat ketika saya menambahkan tajuk tambahan ini (bukan GET ketika saya tidak menambahkannya)

Perilaku yang diharapkan

Permintaan get GET (untuk mempertahankan cookie) dengan header tambahan yang tidak merusak jabat tangan.

Mempersiapkan

  • OS: Mac
  • peramban: Chrome 58
  • versi socket.io: 2.0.3

Komentar yang paling membantu

Hai! Saya pikir Anda harus menambahkan tajuk yang tepat di sisi server (sepertinya Anda berada dalam situasi 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();
  }
});

Saya menambahkan contoh di sana: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

Semua 13 komentar

Masalah yang sama, di sini .. benar-benar berfungsi dengan versi nodejs dari socket.io-client meskipun bukan browser

  • OS: Menang
  • peramban: Chrome 59
  • versi socket.io: 2.0.3

Hai! Saya pikir Anda harus menambahkan tajuk yang tepat di sisi server (sepertinya Anda berada dalam situasi 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();
  }
});

Saya menambahkan contoh di sana: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne cara menentukan beberapa domain untuk Asal, cara berikut tidak berfungsi:

  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 Anda tidak dapat menggunakan banyak domain, Anda perlu membaca asal tajuk klien dan memeriksa kembali daftar putih Anda.

lihat ini dan ini di stackoveflow

@DaVincii saya definisikan sebagai nol, tetapi dibebaskan ke domain apa pun.

header const = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': null,
'Access-Control-Allow-Credentials': benar
};

Untuk Penggunaan CORS
{
handlePreflightRequest: function (req, res) {
var header = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': req.headers.origin ,
'Access-Control-Allow-Credentials': benar
};
res.writeHead(200, header);
res.end();
}
}

Untuk Penggunaan CORS
{
handlePreflightRequest: function (req, res) {
var header = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': req.headers.origin ,
'Access-Control-Allow-Credentials': benar
};
res.writeHead(200, header);
res.end();
}
}

'Access-Control-Allow-Origin': req.headers.origin
Ini baru saja menyelamatkan hari saya! Ketika saya menggunakan:
'Access-Control-Allow-Origin': ' ',Itu akan memberi saya kesalahan berikut:"Nilai header 'Access-Control-Allow-Origin' dalam respons tidak boleh berupa wildcard ' ' ketika mode kredensial permintaan adalah 'include'. Mode kredensial permintaan yang dimulai oleh XMLHttpRequest dikendalikan oleh atribut withCredentials ."

Ini sepertinya tidak berfungsi lagi dengan socket.io terbaru. TypeScript tidak menyukainya. Pokoknya untuk memperbaiki?
image

Ini sepertinya tidak berfungsi lagi dengan socket.io terbaru. TypeScript tidak menyukainya. Pokoknya untuk memperbaiki?

@supertiger1234 handlePreflightRequest memiliki antarmuka yang berbeda di versi terbaru

Screenshot 2020-07-20 at 20 16 00

Jadi dalam kasus Anda seharusnya:

...
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 memiliki antarmuka yang berbeda di versi terbaru

️ Jika Anda menginstal socket.io sekarang dari npm Anda akan memiliki versi lama, tetapi jika Anda menginstal pengetikan (melalui @types) itu akan memiliki pengetikan baru! Yang bisa sangat menyesatkan.

Bagaimana cara menginstal socket io terbaru?

Untuk referensi di masa mendatang: masalah ini juga terjadi saat menggunakan server pasca-3.0 dengan klien pra-3.0. Ini mungkin disebabkan oleh cache yang salah dikonfigurasi yang membuat klien menggunakan versi socket.io.js .

Untuk pembaca masa depan, silakan lihat:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat