IT TIP

socket.io에서 handshakeData와 함께 사용자 정의 데이터를 보내시겠습니까?

itqueen 2020. 12. 13. 11:35
반응형

socket.io에서 handshakeData와 함께 사용자 정의 데이터를 보내시겠습니까?


그래서 나는 socket.io를 백엔드로, 일반 자바 스크립트를 프론트 엔드로 사용하는 노드 js를 실행하는 애플리케이션을 가지고 있습니다. 내 응용 프로그램에는 현재 클라이언트가 연결되는 즉시 로그인 데이터를 보내는 로그인 시스템이 있습니다.

이제 로그인 데이터를 handshakeData와 함께 전송하는 것이 훨씬 더 좋을 것이라고 생각했기 때문에 연결하는 동안 사용자가 직접 로그인하도록 할 수 있습니다 (연결을 설정 한 후 대신) 로그인 데이터가 유효하지 않을 때 각각 인증을 거부 할 수 있습니다.

handshakeData의 헤더 부분에 내 추가 데이터를 넣는 것이 가장 좋을 것이라고 생각합니다. 어떻게 할 수 있는지 아이디어가 있습니까? (가능하면 socket.io를 수정할 필요가 없지만 그것이 내가 함께 살 수있는 유일한 방법이라면)


많은 의견이 아래에 지적했듯이 Socket.IO API는 1.0릴리스 에서 변경 되었습니다. 이제 미들웨어 기능을 통해 인증을 수행해야합니다. '인증 차이'@ http://socket.io/docs/migrating-from-0-9/#authentication-differences를 참조하십시오 . 이전 문서가 사라진 것처럼 보이기 때문에 <1.0에 붙어있는 사람에 대한 내 원래 답변을 포함시킬 것입니다.

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'));
});

1.0 이전

두 번째 인수의 query : param을 클라이언트 측의 connect ()에 전달할 수 있으며 이는 권한 부여 메소드의 서버에서 사용할 수 있습니다.

방금 테스트했습니다. 클라이언트에는 다음이 있습니다.

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();
});

socket.io v1.2.1의 경우 다음을 사용하십시오.

io.use(function (socket, next) {
  var handshake = socket.handshake;
  console.log(handshake.query);
  next();
});

이것은 nodejs 및 server.io 서버 클라이언트에 쿼리 데이터를 보내는 코드입니다.

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

쿼리 매개 변수에없는 핸드 셰이크 통해 클라이언트에서 서버로 데이터를 가져 오는 방법을 아는 사람이 있으면 알려주세요.

업데이트 나는이 구문을 사용하여 나중에 문제에 달렸다

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
}

오래된 스레드이지만 세션 쿠키 (표준 물건)에 jwt 토큰 / 세션 ID를 저장한다고 가정하면 핸드 셰이크 (socket.io-client)를 수행 할 때 기본적으로 서버에 전달됩니다. 쿠키를 통해 핸드 셰이크 (미들웨어 또는 on.connection을 통해)에 대한 인증 정보를 얻는 데 문제가 있습니까? 예.

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()
  }
}

I'm using this now for a project and it's working fine.

참고URL : https://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io

반응형