당신의 serverOptions
개체를 먼저 설치하십시오 NPNProtocols
를 들어
var serverOptions = {
port: 3000,
host: 127.0.0.1, //address to your site
key: '/etc/nginx/ssl/your_site/server.key', //Or whatever the path to your SSL is
cert: '/etc/nginx/ssl/your_site/server.crt',
NPNProtocols: ['http/2.0', 'spdy', 'http/1.1', 'http/1.0']
}
, 당신은 그들 모두에 대해 걱정하지 않을 수 있습니다,하지만 그들은는 참조 용으로 제공하고 있습니다.
지금 바로 서버 생성 : 측면으로 \
물건이 완전히 활짝 열려 있습니다주의
var app = require('https').createServer(serverOptions),
io = require('socket.io')(app);
이 꽤 플러그를하고 그 시점에서 소스로 재생해야하고 누구든지들을 수 있습니다. 귀하의 웹 소켓에, 그래서 아무것도 여기를 통해 비공개입니다 보내야합니다. 데이터를 비공개로 설정해야하는 경우 두 가지 중 하나가 필요합니다.
- 뭔가 정의 뭔가
Redis
큐와 해당 인터페이스
JWT-Auth Token
처럼 : 당신은 그냥 IO
인스턴스를 얻을 수 있습니다 이제 var SECRET_KEY = '<YOUR_LARAVEL_SECRET_KEY>';
var laravel_session_parser = {
ord: function (string) {
return string.charCodeAt(0);
},
decryptSession: function (cookie, secret) {
if (cookie) {
var session_cookie = JSON.parse(new Buffer(cookie, 'base64'));
var iv = new Buffer(session_cookie.iv, 'base64');
var value = new Buffer(session_cookie.value, 'base64');
var rijCbc = new mcrypt.MCrypt('rijndael-128', 'cbc');
rijCbc.open(secret, iv);
var decrypted = rijCbc.decrypt(value).toString();
var len = decrypted.length - 1;
var pad = laravel_session_parser.ord(decrypted.charAt(len));
return phpunserialize.unserialize(decrypted.substr(0, decrypted.length - pad));
}
return null;
},
getUidFromObj: function (obj, pattern) {
var regexp = /login_web_([a-zA-Z0-9]+)/gi;
if (pattern) {
regexp = pattern;
}
var u_id = null;
for (var key in obj) {
var matches_array = key.match(regexp);
if (matches_array && matches_array.length > 0) {
u_id = obj[matches_array[0]];
return u_id;
}
}
return u_id;
},
getRedisSession: function (s_id, cb) {
var _sessionId = 'laravel:' + s_id;
client.get(_sessionId, function (err, session) {
if (err) {
cb && cb(err);
return;
}
cb && cb(null, session);
});
},
getSessionId: function (session, _callback) {
var u_id = null,
err = null;
try {
var laravelSession = phpunserialize.unserialize(phpunserialize.unserialize(session));
u_id = laravel_session_parser.getUidFromObj(laravelSession);
} catch (err) {
_callback(err, null);
}
_callback(err, u_id);
},
ready: function (socket, _callback) {
if (typeof socket.handshake.headers.cookie === 'string') {
var cookies = cookie.parse(socket.handshake.headers.cookie);
var laravel_session = cookies.laravel_session;
var session_id = laravel_session_parser.decryptSession(laravel_session, SECRET_KEY);
laravel_session_parser.getRedisSession(session_id, function (err, session) {
if (!err && session) {
laravel_session_parser.getSessionId(session, function (err, user_id) {
if (user_id) {
_callback(null, session_id, user_id, laravel_session)
} else {
_callback(new Error('Authentication error'), null);
}
});
} else {
_callback(new Error('Authentication error'), null);
}
});
}
}
};
: 여기
것은 후자의 예 개인의 session
이 socket.io에 연결할 때
io.on('connection', function (socket) {
laravel_session_parser.ready(socket, function(err, session_id, user_id, laravel_session) {
//log out the variables above to see what they provide
});
});
주, 나는 Laravel 및 노드 사이에 환경 변수를 공유 할 수 NodeJS
에서 dotenv
를 사용하는 것을 선호합니다.
그런 다음 process.env.APP_KEY
을 수행 할 수 있으며 변수 공유에 대해 걱정할 필요가 없습니다.
위의 스크립트는 완전하지 않으며 프로덕션 준비가되지 않았으므로 예제로 사용하기위한 것입니다.
나는 당신의 말을 보았습니다. 주된 질문에 내가 가지고있는 것을 당신이 제안한 것을 구현하는 방법을 너무 확실하지 않은 것으로 포함시킬 것입니다. –
@Dean 'http.listen (3000 ...'이 아닌'app.listen (serverOptions.port)'만 해주세요. – Ohgodwhy
감사합니다. 올바른 방향으로 나를 가리켜 주며. 연결은 신뢰할 수 없습니까? –