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
'IT TIP' 카테고리의 다른 글
자바 스크립트를 통해 브라우저의 포커스 테두리 제거 또는 비활성화 (0) | 2020.12.13 |
---|---|
펜촉이지만 UITableView를 얻지 못했습니다. (0) | 2020.12.13 |
Spring : web.xml의 네임 스페이스 대 contextConfigLocation 초기화 매개 변수 (0) | 2020.12.13 |
부트 스트랩 아코디언 버튼이 작동하지 않는 "데이터 부모"전환 (0) | 2020.12.13 |
rbenv install --list에 버전 2.1.2가 나열되지 않음 (0) | 2020.12.13 |