Socket.io-client: izinkan akses ke header jabat tangan

Dibuat pada 14 Mar 2014  ·  19Komentar  ·  Sumber: socketio/socket.io-client

Saat membuat koneksi, saya dapat 'mengakses' ke string kueri melalui io.connect(url, {query:'key=value'})

Saya berharap dapat melakukan sesuatu yang serupa dengan header.

Saya ingin menggunakan ini untuk membangun webapi, dengan otentikasi token.

Komentar yang paling membantu

+1 ada pembaruan tentang ini?

Semua 19 komentar

Ingin memiliki ini juga.

Saya pikir mungkin lebih baik untuk mengatakan 'mengatur' tajuk saat membuat permintaan.

Masalah dengan mengharapkan perubahan header adalah bahwa transport tertentu tidak mengizinkannya:

  • WebSocket tidak mengizinkan tajuk khusus
  • JSONP Polling (alias <script> ) tidak mengizinkannya

Satu-satunya syarat yang memungkinkan kita untuk mengatur header tertentu adalah dengan memaksa socket.io untuk hanya menggunakan XHR Polling

Saya mengharapkan sesuatu yang serupa untuk dapat mengotentikasi klien. Mengirim token otorisasi (atau kata sandi) dalam string kueri bukanlah ide yang baik.

Saya telah membuat modul untuk mengirim kredensial di badan sebagai gantinya: https://github.com/invisiblejs/socketio-auth

@rauchg dapatkah Anda menjelaskannya lebih lanjut, dokumentasi di https://github.com/Automattic/socket.io/wiki/authorizing#handshaking mengatakan:

The handshake is initiated with either an XHR request or a JSONP request

Karena:

Users might want to authorize the clients based on information from the headers or IP address

Sejak:

Not all transports sends headers when they attempt to establish a real time connection with the server

Jadi, bukankah ini menunjukkan bahwa itu masih dapat membuat koneksi WS meskipun jabat tangan dalam XHR, dan oleh karena itu menggunakan header permintaan untuk otorisasi tidak masalah?

Sepertinya Anda memang memiliki kode untuk itu pada satu tahap https://github.com/Automattic/socket.io-client/issues/344#issuecomment -9424237

Jadi saya kira ada masalah sehingga tidak pernah sampai ke repo utama selain dari cookie yang sepertinya telah dihapus. Dalam hal ini akan lebih baik untuk memperbarui dokumentasi server yang agak menyesatkan http://socket.io/docs/server-api/#namespace #use%28fn:function%29:namespace

var io = require('socket.io')();
io.use(function(socket, next){
  if (socket.request.headers.cookie) return next();
  next(new Error('Authentication error'));
});

karena menunjukkan cookie (yaitu header) dapat digunakan untuk otentikasi. Dan tambahkan pengganti ke dokumen wiki otentikasi usang di situs utama dengan contoh untuk otentikasi dan penyebutan masalah dengan pendekatan lain karena saya yakin ini adalah skenario umum.

+1 untuk beberapa resolusi untuk ini. Dokumen dan contoh menghabiskan waktu saya karena saya mengharapkan akses yang lebih baik ke pengaturan header untuk token auth juga.

+1. Ada rilis klien engine.io yang akan datang yang memungkinkan akses ke header, yang seharusnya memfasilitasi penyelesaian masalah ini.
https://github.com/socketio/engine.io-client/pull/379

Apakah ini tersedia dari perpustakaan JS klien juga? Juga, apakah itu pernah benar-benar masuk? Saya melihatnya digabung tetapi saya tidak berpikir itu operasional, bisa jadi salah

+1. Saya mengalami situasi serupa di mana saya perlu mengautentikasi klien browser. socket.io-client tampaknya tidak mengizinkannya.

+1 ada pembaruan tentang ini?

Ada pembaruan tentang ini?

Ada pembaruan tentang ini?

Sejak 2.0.0 , Anda sekarang dapat memberikan objek extraHeaders :

const socket = io({
  transportOptions: {
    polling: {
      extraHeaders: {
        'x-clientid': 'abc'
      }
    }
  }
});

Ditambahkan ke dokumentasi di sini .

Sejak 2.0.0 , Anda sekarang dapat memberikan objek extraHeaders :

const socket = io({
  transportOptions: {
    polling: {
      extraHeaders: {
        'x-clientid': 'abc'
      }
    }
  }
});

Ditambahkan ke dokumentasi di sini .

Saya mendapatkan kesalahan CORS berikut dengan ini meskipun saya menggunakan cors dengan express :

Respons terhadap permintaan preflight tidak lulus pemeriksaan kontrol akses: Tidak memiliki status ok HTTP.

@4nubhav Anda harus melewati fungsi handlePreflightRequest seperti ini:

    handlePreflightRequest: (request, response) => {
        const headers = { ... };
        response.writeHead(200, headers);
        response.end();
    }

Sejak 2.0.0 , Anda sekarang dapat memberikan objek extraHeaders :

const socket = io({
  transportOptions: {
    polling: {
      extraHeaders: {
        'x-clientid': 'abc'
      }
    }
  }
});

Ditambahkan ke dokumentasi di sini .

Saya menggunakan .of("/path") di server Socket lalu apa yang saya lakukan di mana saya mendeklarasikan URL.

@4nubhav Anda harus mengizinkan header itu dengan handlePreflightRequest di sisi server.

const options = {
    handlePreflightRequest: (req, res) => {
        res.writeHead(200, {
            'Access-Control-Allow-Headers': 'x-clientid', // <<< this
        });
        res.end();
     },
};
const io = require('socket.io')(server, options);

Pembaruan: di Socket.IO v3, transportOptions tidak diperlukan lagi, Anda cukup menggunakan:

const socket = io({
  extraHeaders: {
    'x-clientid': 'abc'
  }
});

Dokumentasi untuk CORS:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat