Ich habe also eine Anwendung, die den Knoten js mit socket.io als Backend und normales Javascript als Frontend ausführt. Meine Anwendung verfügt über ein Anmeldesystem, bei dem der Client seine Anmeldedaten derzeit einfach sendet, sobald er verbunden ist.
Jetzt dachte ich, es wäre viel schöner, wenn die Anmeldedaten zusammen mit den HandshakeData gesendet werden, sodass ich den Benutzer direkt beim Verbinden anmelden kann (anstatt nach dem Herstellen einer Verbindung) bzw. die Autorisierung ablehnen, wenn die Anmeldedaten ungültig sind.
Ich denke, es wäre das Beste, meine zusätzlichen Daten in den Header-Teil der HandshakeData zu packen, also irgendwelche Ideen, wie ich das tun könnte? (Ohne, wenn möglich, socket.io ändern zu müssen, aber wenn es die einzige Möglichkeit ist, damit ich leben kann)
Wie viele Kommentare hervorgehoben haben, wurde die Socket.IO-API in ihrer 1.0
-Version geändert. Die Authentifizierung sollte jetzt über eine Middleware-Funktion erfolgen, siehe 'Authentifizierungsunterschiede' @ http://socket.io/docs/migrating-from-0-9/#authentication-differences . Ich füge meine ursprüngliche Antwort für jeden hinzu, der auf <1.0 steckt, da die alten Dokumente verschwunden zu sein scheinen.
Kundenseite:
//The query member of the options object is passed to the server on connection and parsed as a CGI style Querystring.
var socket = io("http://127.0.0.1:3000/", { query: "foo=bar" });
Serverseite:
io.use(function(socket, next){
console.log("Query: ", socket.handshake.query);
// return the result of next() to accept the connection.
if (socket.handshake.query.foo == "bar") {
return next();
}
// call next() with an Error if you need to reject the connection.
next(new Error('Authentication error'));
});
Sie können im zweiten Argument eine Abfrage: param übergeben, um connect () auf der Clientseite zu verwenden, die auf dem Server in der Autorisierungsmethode verfügbar sein wird.
Ich habe es gerade getestet. Auf dem Kunden habe ich:
var c = io.connect('http://127.0.0.1:3000/', { query: "foo=bar" });
Auf dem Server:
io.set('authorization', function (handshakeData, cb) {
console.log('Auth: ', handshakeData.query);
cb(null, true);
});
Die Ausgabe auf dem Server sah dann so aus:
:!node node_app/main.js
info - socket.io started
Auth: { foo: 'bar', t: '1355859917678' }
Dies wurde nun in v1.0.0 geändert. Siehe die Migrationsdokumente .
grundsätzlich gilt,
io.set('authorization', function (handshakeData, callback) {
// make sure the handshake data looks good
callback(null, true); // error first, 'authorized' boolean second
});
wird :
io.use(function(socket, next) {
var handshakeData = socket.request;
// make sure the handshake data looks good as before
// if error do this:
// next(new Error('not authorized');
// else just call next
next();
});
Verwenden Sie für socket.io v1.2.1 Folgendes:
io.use(function (socket, next) {
var handshake = socket.handshake;
console.log(handshake.query);
next();
});
Dies ist mein Code zum Senden von Abfragedaten an nodejs und server.io Server Client.
var socket = io.connect(window.location.Origin, { query: 'loggeduser=user1' });
io.sockets.on('connection', function (socket) {
var endp = socket.manager.handshaken[socket.id].address;
console.log("query... " + socket.manager.handshaken[socket.id].query.user);
}
Vielleicht hat sich die API geändert, aber ich habe Folgendes getan, um zusätzliche Informationen an den Server zu bekommen.
// client
io.connect('localhost:8080', { query: 'foo=bar', extra: 'extra'});
// server
io.use(function(sock, next) {
var handshakeData = sock.request;
console.log('_query:', handshakeData._query);
console.log('extra:', handshakeData.extra);
next();
});
druckt
_query: { foo: 'bar',
EIO: '3',
transport: 'polling',
t: '1424932455409-0' }
extra: undefined
Wenn jemand weiß, wie man Daten vom Client zum Server durch den Handshake erhält das ist nicht in den Abfrageparametern lass es mich wissen.
Update Ich bin später mit dieser Syntax auf Probleme gestoßen
io.connect('localhost:8080?foo=bar');
ist was ich gerade benutze.
Ich habe ein kleines Problem gefunden, um den .loggeduser zu sehen.
io.sockets.on('connection', function (socket) {
var endp = socket.manager.handshaken[socket.id].address;
console.log("query... " + socket.manager.handshaken[socket.id].query.loggeduser);
// ↑ here
}
Alter Thread, vorausgesetzt, Sie speichern Ihre jwt-Token-/Sitzungs-ID in Sitzungscookies (Standardmaterial). Dies wird ohnehin standardmäßig an den Server übergeben, wenn Sie Handshake (socket.io-client) ausführen Holen Sie sich einfach die Auth-Informationen für den Handshake (über Middleware oder on.connection) über Cookie? z.
io.on('connection', function(socket) {
// assuming base64url token
const cookieStr = socket.handshake.headers.cookie
const matchRes =
cookieStr == null
? false
: cookieStr.match(/my-auth-token=([a-zA-Z0-9_.-]+)/)
if (matchRes) {
// verify your jwt...
if ( tokenIsGood(matchRes[1]) {
// handle authenticated new socket
} else {
socket.emit('AUTH_ERR_LOGOUT')
socket.disconnect()
}
} else {
socket.emit('AUTH_ERR_LOGOUT')
socket.disconnect()
}
}
Ich benutze das jetzt für ein Projekt und es funktioniert gut.