2014-01-28 4 views
16

sailsjspassport으로 소켓을 통한 인증을 얻으려고합니다.소켓을 통한 인증 방법

소켓 연결에 세션이 없으며 sailsjs가 요청 개체를 조롱하여 Passport 미들웨어 설정이없는 것으로 보이는 것입니다. 이로 인해 노드 012는 req 객체에 logIn이라는 메서드가 없다는 오류가 발생합니다.

그래서 여기에 @xdissent에서 제공하는 코드 스 니펫을 따르려고했습니다 : Sails.js + Passport.js authentication through websockets 실제로 오류를 던지지 않고 로그인 할 수 있습니다. 아니면 ..? 뭔가가 인 것으로 밝혀졌습니다. 그러나 나는 무엇을 모릅니다. 왜냐하면 다른 소켓 요청을 통해 req.user을 가져 오면 빈 객체가 반환되기 때문입니다.

나는 또한 redis에서 봤다. 이것은 밖으로 나왔다 :

redis 127.0.0.1:6379> keys * 
1) "waterline:broadcasting:_sequences:id" 
2) "sess:aDJI0YHzh17E3AMjtKsZSijs" 
redis 127.0.0.1:6379> get "sess:aDJI0YHzh17E3AMjtKsZSijs" 
"{\"cookie\":{\"httpOnly\":true,\"path\":\"/\"}}" 
redis 127.0.0.1:6379> 

그래서 거기에 사용자가 저장됩니다.

짧은 이야기로, 어떻게 여권과 sailsjs가 소켓을 뛰어 넘게 할 수 있습니까?

업데이트 : 일반적으로 세션, 소켓 및 쿠키에 대한 정보가 필요합니다. 따라서 세션에서 물건을 설정하고 브라우저를 새로 고치면 여전히 거기에 있기를 바랍니다. 소켓 연결과 동일한 페이지에서 xhr 호출을하면 동일한 세션이되어서는 안됩니까?

+0

합니다. – gorelative

+0

+1 이미 문제의 해결책을 찾았습니까? – HaNdTriX

+0

https://github.com/jfromaniello/passport.socketio를 시도해 보셨습니까 –

답변

8

Kasper Isager 덕분에 가까운 장래에 sails.js 용 패스포트 생성기가 생길 것입니다 (Sails.js 버전 0.10).

그는 정책 (돛 미들웨어)을 사용하여 Passport를 구현합니다.

API는/서비스//

var passport = require('passport'); 

passport.serializeUser(function(user, next) { 
    next(null, user.id); 
}); 

passport.deserializeUser(function(id, next) { 
    User.findOne(id).done(next); 
}); 

// Put your Passport config logic here 

// Make passport globally available 
module.exports = passport; 

API/정책을 passport.js passport.js

module.exports = function (req, res, next) { 

    // Initialize Passport 
    passport.initialize()(req, res, function() { 
    // Use the built-in sessions 
    passport.session()(req, res, function() { 
     // Make the user available throughout the frontend 
     res.locals.user = req.user; 

     next(); 
    }); 
    }); 

}; 

설정/policies.js

module.exports.policies = { 

    '*': [ 'passport' ], 

    // MyCustomController: { 
    // update: [ 
    //  'passport', 
    //  'authorize' 
    // ] 
    // } 

}; 

이렇게하면 여권 요청 방법 (logIn 등)을 소켓 요청에서도 사용할 수 있습니다. 서버 측 세션 객체 로그인 성공 후

는 다음과 같이 표시됩니다

설정/소켓 :

{ 
    // Express 
    cookie: { 
     originalMaxAge: null, 
     expires: null, 
     httpOnly: true, 
     path: '/' 
    }, 
    // Passport 
    passport: { 
     user: '52fc98e108b31348a537fa43' // userId 
    } 
} 

당신은 req.session 또는 심지어 같은 소켓 콜백에있는 모든 정책에 액세스 할 수 있습니다 .JS

onConnect: function(session, socket){} 
onDisconnect: function(session, socket){} 

당신이 Kaspers 전체 구현이 자신의 저장소 확인해보고 싶다면 : 그것으로 난에 대한 답을 알아 내기 위해 아직했습니다 좋은 질문이 upvoting sails-generate-auth

+1

여권이 어떻게 작동하는지 오해 할 수도 있지만'passport.serializeUser'와 역 직렬화를 서비스에서하지 말아야합니까? 그렇지 않으면 매 요청마다 (비) 직렬화 함수를 다시 선언하고 있습니까? – Hudon

+1

모두와 함께 공유해 주셔서 감사합니다 (물론 Kasper 덕분입니다). 이것은 훌륭합니다. – mikermcneil

+0

@ Hudon 네, 맞습니다. ''serializeUser'''와''deserializeUser'''는 한 번만 초기화되기 때문에 두 가지 방법 모두 더 좋은 방법입니다. – HaNdTriX