2017-03-13 3 views
0

나는 로컬 전략과 JWT와 함께 인증/승인을 위해 여권을 사용하고 있습니다. 일부 연구에 따라돛 소켓 인증 (여권 사용)

(집중적 인 인터넷 검색) I 권한 부여를위한 최고의 장소는 '가상 보낼 수 있습니다 SailsSocket 개체를 통해 정기적으로 HTTP 요청 및 소켓 요청 (모두에 적용되는 정책을 사용하는 것을 이해 HTTP 같은 요청).

저는 이제 소켓을 올바르게 사용하는 방법을 알아 내려고 노력하고 있으며 연결을 거부 할 수있는 beforeConnect 처리기가 있다는 것을 보았습니다. 큰 문제는 아니지만 (데이터를 가져올 수 없도록하는 정책이 있음) 연결을 거부 할 수 있기를 원합니다. 더 건강하고 어떤 이유로 소켓을 연결할 수 있는지 생각합니다.

난 단지 내 소켓 초기화에 나는 JWT 포함하는 헤더를 설정할 수 있도록 초기 인증 후 연결 소켓 할

이 보인다

io.sails.url = connections.http.baseURL; 

io.sails.headers = { 
    'Authorization': 'Bearer ' + token 
}; 

io.sails.useCORSRouteToGetCookie = false; 

io.socket = io.sails.connect(); 
io.socket.on('...', someHandler); 

이 잘 작동하기 - 소켓 요청이 JWT 정책 안타를 소켓 요청에 대한 컨트롤러 메서드에서 req.user를 얻습니다.

내 질문은 - 내가 연결하는 토큰없이 사용자를 거부 가야합니까 어떻게이 beforeConnect 내부에 침입했을 때 나는 악수의 인증 헤더가 표시되지 않습니다

(나는 심지어해야합니까?) 목적.

업데이트 :는 또한, 지금 연결할 때 쿼리에서 토큰을 보내려고하고있다 : 그와

io.socket = io.sails.connect({token: token}); 

, 나는 핸드 셰이크에있는 토큰을 볼 수 있어요. 나는 그것이 존재하지 않는 handshake.query에있을 것으로 기대합니다. 대신, handshake._query에서 사용할 수 있지만 돛 워드 프로세서 (here)이다하에해야한다 주장 socket.handshake.query (그러나 socketbeforeConnect에 존재하지 않고, 기본 기능 풋 프린트 beforeConnect: function(handshake, cb)입니다)

이 버그 있습니까? 내가 놓친 게 있니?

답변

0

돛 개발자 (here, thanks sgress454) 중 하나와 토론 다음은

  1. 헤더 연결에 대한 초기 요청과 함께 전송되지 않습니다. 그것은 socket.io 사양의 일부이며 돛 자체에는 문제가되지 않습니다. socket.io의 최신 버전에서 transportOptions을 설정하는 것이 가능할 수 있지만 아직 돛에 통합되지 않았습니다 (2017-04-02).

  2. 모든 쿼리 매개 변수는 _query 속성 인 handshake 인수로 나타납니다. 이것은 (현재) 올바르게 문서화되지 않았습니다. 가까운 장래에 문서가 업데이트 될 예정입니다. 나는 내가 beforeConnect 방법에 통합 passport.js을 할 수있는 방법을 찾을 수 없습니다로 내 자신의 코드를 사용하여 토큰 검증을 구현했습니다 - 기본 문제에 관해서는

.)

beforeConnect: function(handshake, cb) { 
    // `true` allows the connection 
    // (`false` would reject the connection) 

    var token = handshake._query ? handshake._query.token : null; 

    CipherService.verifyToken(token, function verifyTokenResults(err, decoded, info) { 
     if (err || !decoded) { 
      if (err.name === "TokenExpiredError") { 
       // token expired - user can't connect... 
       return cb(null, false); 
      } else { 
       // some other error... 
       return cb(err, false); 
      } 
     } 

     // here you may want to do other verification, e.g. the user is active 
     return cb(null, true); 
    }); 

}, 

내가 지금 see here :-(자동 재 연결 문제가 : config/sockets.js에서 내가 좋아하는 뭔가를 - :