Отправить пользовательские данные вместе с handshakeData в сокете.Ио?
таким образом, у меня есть приложение под управлением узла js с сокетом.io как бэкэнд и обычный javascript как интерфейс. Мое приложение имеет систему входа в систему, которая в настоящее время просто клиент отправляет свои данные входа, как только он подключен.
теперь я подумал, что было бы намного лучше, чтобы данные для входа были отправлены вместе с handshakeData, поэтому я могу напрямую войти в систему при подключении (вместо того, чтобы после установления соединения) соответственно отказаться от авторизации, когда недопустимые данные входа.
Я думаю, что было бы лучше поместить мои дополнительные данные в заголовочную часть handshakeData, поэтому есть идеи, как я мог бы это сделать? (Без необходимости изменять сокет.io, если это возможно, но если это единственный способ жить с этим)
6 ответов
как много комментариев указали ниже сокета.IO API изменился в их 1.0
релиз. Теперь аутентификация должна выполняться с помощью функции промежуточного ПО, см. "различия аутентификации"@ http://socket.io/docs/migrating-from-0-9/#authentication-differences. Я включу свой первоначальный ответ для тех, кто застрял на
1.0 и выше:
На Стороне Клиента:
//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" });
сервер Сторона:
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'));
});
Pre 1.0
вы можете передать запрос: param во втором аргументе для подключения () на стороне клиента, который будет доступен на сервере в методе авторизации.
Я только что тестировал его. На клиенте у меня:
var c = io.connect('http://127.0.0.1:3000/', { query: "foo=bar" });
на сервере:
io.set('authorization', function (handshakeData, cb) {
console.log('Auth: ', handshakeData.query);
cb(null, true);
});
вывод на сервере тогда выглядел так:
:!node node_app/main.js
info - socket.io started
Auth: { foo: 'bar', t: '1355859917678' }
теперь это было изменено в v1.0.0. Вижу миграционные документы
по сути,
io.set('authorization', function (handshakeData, callback) {
// make sure the handshake data looks good
callback(null, true); // error first, 'authorized' boolean second
});
будет :
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();
});
для сокета.io v1.2.1 Используйте это:
io.use(function (socket, next) {
var handshake = socket.handshake;
console.log(handshake.query);
next();
});
Это мой код для отправки данных запроса на nodejs и сервер.клиент сервера ввода-вывода.
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);
}
возможно, api изменился, но я сделал следующее, чтобы получить дополнительную информацию на сервер.
// 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();
});
печать
_query: { foo: 'bar',
EIO: '3',
transport: 'polling',
t: '1424932455409-0' }
extra: undefined
Если кто-нибудь знает как получить данные от клиента к серверу через рукопожатие этого нет в запросе params дайте мне знать, пожалуйста.
обновление я столкнулся с проблемами позже с этим синтаксисом
io.connect('localhost:8080?foo=bar');
это то, что я сейчас использую.
Я нашел небольшую проблему, чтобы увидеть .loggeduser
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
}