2016-08-08 2 views
0

현재 완벽하게 작동하는 빨간색으로 라우트 된 I/O 소켓이 있습니다. 그 때까지는 도메인에 SSL 인증서를 설정해야합니다.Laravel IO 소켓 및 SSL https 연결을 통해 다시 연결

나는 3001

가 그럼 난 IO ('// {{를 통해 듣는 페이지에서 3000

내 JS 듣고 설정 socket.js이 포트에서 실행 레디 스 서버가 $ 듣기}} : 3000 ').

모든 안내는 https를 통해 어떻게 작동하는지 잘 설명합니다. 443을 항구로 사용하겠습니까?

감사합니다.

내 socket.js

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var Redis = require('ioredis'); 
var redis = new Redis(); 
redis.subscribe('notifications', function(err, count) { 
}); 
redis.on('message', function(channel, message) { 
    console.log('Message Recieved: ' + message); 
    message = JSON.parse(message); 
    io.emit(channel + ':' + message.event, message.data); 
}); 
http.listen(3000, function(){ 
    console.log('Listening on Port 3000'); 
}); 

답변

1

당신의 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); 

이 꽤 플러그를하고 그 시점에서 소스로 재생해야하고 누구든지들을 수 있습니다. 귀하의 웹 소켓에, 그래서 아무것도 여기를 통해 비공개입니다 보내야합니다. 데이터를 비공개로 설정해야하는 경우 두 가지 중 하나가 필요합니다.

  1. 뭔가 정의 뭔가 Redis 큐와 해당 인터페이스
  2. 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을 수행 할 수 있으며 변수 공유에 대해 걱정할 필요가 없습니다.

위의 스크립트는 완전하지 않으며 프로덕션 준비가되지 않았으므로 예제로 사용하기위한 것입니다.

+0

나는 당신의 말을 보았습니다. 주된 질문에 내가 가지고있는 것을 당신이 제안한 것을 구현하는 방법을 너무 확실하지 않은 것으로 포함시킬 것입니다. –

+0

@Dean 'http.listen (3000 ...'이 아닌'app.listen (serverOptions.port)'만 해주세요. – Ohgodwhy

+0

감사합니다. 올바른 방향으로 나를 가리켜 주며. 연결은 신뢰할 수 없습니까? –