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.
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:
<script>
) tidak mengizinkannyaSatu-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 objekextraHeaders
: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 objekextraHeaders
: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:
Komentar yang paling membantu
+1 ada pembaruan tentang ini?