2012-08-06 6 views
1

Node.js (Express 프레임 워크)을 사용하여 웹 사이트를 만들고 인증을 위해 Passportjs을 사용하고 있습니다. 나는 클라이언트와 서버 간의 통신을 위해 socket.io을 사용한다. 내 웹 사이트는 어떤 사용자가 온라인인지 보여줍니다. 클라이언트가 웹 사이트에서 로그 아웃하지 않고 탭이나 브라우저를 닫을 때 'disconnect' 이벤트가 발생하면 사용자가 웹 사이트에서 로그 아웃되기를 원합니다. 코드 조각은 server과 비슷해야합니다.Node.js/Socket.io/Passport.js 로그 아웃 문제

io.sockets.on('connection', function (socket) { 
socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    //LOGOUT USER CODE 
}); 
}); 

저는 Passportjs의 로컬 전략을 사용하고 있습니다. CouchDB 데이터베이스에서 사용자를 검색하고 Username/Password 조합이 맞으면 로그인합니다. 분명히 작동하지 않습니다

내 솔루션 :

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/')); 
    app.use(express.session({ secret: 'keyboard cat'})); 
    // Initialize Passport! Also use passport.session() middleware, to support 
    // persistent login sessions (recommended). 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 

    //a new custom middleware to logout the user when the pathname is '/exit'  

    app.use(function(req, res, next) { 
     var pathname = url.parse(req.url).pathname; 
     if(pathname == '/exit') 
     req.logout(); 
     next(); 
    }); 
}); 

나는 HTTP 요청을 만들려면 다음과 같이 정의 xmlhttprequest라는 노드 모듈을 사용했다.

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 

내 소켓의 연결 끊기 이벤트에서 다음 줄을 추가했습니다.

io.sockets.on('connection', function (socket) { 
socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    var xhr = new XMLHttpRequest();  
    xhr.open("GET", "http://localhost:3000/exit"); 
    xhr.send(); 
}); 
}); 

이 작동하지 않는 사용자가 때 disconnect 이벤트 불을 기록되지 않습니다. 콘솔에이 메시지 |||||| DISCONNECTED ||||||이 있습니다. 또한 브라우저 주소창에 http://localhost:3000/exit을 입력 한 다음 Enter 키를 누르면 브라우저에 Cannot GET /exit 메시지가 표시되지만 페이지를 다시 누르면 사용자가 로그 아웃됩니다.

+0

무엇이 표시되지 있습니까? 당신이 가진 것이 그것이 효과가있는 것처럼 보입니다. 아니면 아직 서버에 구현하지 않았습니까? – jcolebrand

+0

연결 해제 이벤트 내에 있어야 할 코드를 모르겠습니다. – Shekhar

+0

질문을 편집했습니다. 한번 봐주세요! – Shekhar

답변

0

이 코드는 좋지 않습니다.

app.use(function(req, res, next) { 
     var pathname = url.parse(req.url).pathname; 
     if(pathname == '/exit') 
     req.logout(); 
     //try adding this line, so that it doesn't just show the "can't retrieve" 
     res.end('<html><head>logged out</head><body>logged out</body></html>'); 
     next(); 
    }); 

편집 : 대신

socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    var xhr = new XMLHttpRequest();  
    //this won't work, don't do this 
    xhr.open("GET", "http://localhost:3000/exit"); 
    xhr.send(); 
}); 

, 이렇게 :

socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    user.logout(); 
}); 

을 내가 종료,이 시점에서 페이지에서 리디렉션을 수행 제안, 종료는 다른이로 리디렉션 보내 다른 페이지. 그것은 내가 그것을 할 수있는 방법입니다.

+0

아니, 그건 문제가 아니야. 문제는 브라우저에서 URL을 입력하거나 나를 로그 아웃하는 로그 아웃 버튼을 클릭하고 싶지 않다는 것입니다. 연결 끊기 이벤트가 발생할 때 발생하고 싶습니다. 현재 시나리오에서는 HTTP 요청을 작성하여 사용자를 로그 아웃 할 수 없습니다. 내 브라우저 창에서 동일한 URL을 입력 한 다음 Enter 키를 눌러야 만 LOGOUT을 할 수 있습니다. 그리고 나는 그것을하고 싶지 않습니다. – Shekhar

+0

나는 당신의 방법을 시도했다. 오류가 발생합니다. 오류 : 헤더를 보낸 후 설정할 수 없습니다. – Shekhar

+0

우 오케이. 또한, 헤더를 설정할 수없는 것은 아마도 "끝"을 두는 문제 일 것입니다. 나는이 시점에서 여러분이 꽤 잘 수행하고 있음을 보여주고 싶었습니다. 의사였다 사용자가 정의되지 않은 – jcolebrand