2013-10-25 2 views
0

나는 이것에 관해 많은 걸음돌이가 있음을 알고 있지만, 내가 찾던 것을 발견하지 못했습니다.노드 js와의 사용자 인증

그래서 노드 js로 사용자 로그인을 만들고 싶습니다. express, mongo db를 사용하고 있지만 무엇보다도 socket.io를 사용하고 있습니다.

app.get('/', function(req, res) { 
    fs.readFile(__dirname + '/../index.html', 'utf8', function(err, text){ 
    res.send(text); 
    }); 
}); 

<form method="get" id="lala" > 
    <input type="text" name="user"> 
    <input type="text" name="user"> 
    <button id="button">KOKo</button> 
</form> 

버튼 클릭에 : 그래서 나는 사람들이 내 index.html 파일, 사용자 지정 양식을 채우려는 내가이 사용자 이름과 암호를 확인하고 싶은 서버 측에서 이제

socket.emit('checkLogin', { my collected data from the form }); 

및 만약 그들이 괜찮 으면, (내가 어떻게 여기에,하지만 PHP는 내가 SESSION['user_id'] (예) 그래서 내가이 세션을 확인할 수있는 다른 요청에 대한 돌아 오면 그 사용자가 로그인되어 있고 그 사람을 알고 cna가 페이지를 참조하십시오. passport.js mongo-db 세션 저장소를 보았지만 데모가 작동하지 못했습니다. 세션을 저장하는 방법, 세션을 확인하는 방법, 그리고 이러한 모든 종류의 것들. 내가 가게에 세션을 설정하고 내가 어떻게이 그 이후에 도달 하죠 어떻게 지금

function check_auth_user(username,password,done,public_id){ 
    var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1"; 
    connection.query(sql, function (err,results) { 
    if (err) throw err; 

    if(results.length > 0){ 

     var res=results[0]; 
     passport.serializeUser(function(res, done) { 
     done(null,res); 
     }); 

     passport.deserializeUser(function(id, done) { 
     done(null,res); 
     }); 
     return done(null, res); 
    } else { 
     return done(null, false); 
    } 
    }); 
} 

을하지만 :

그래서 누군가가 나를 도와 나 같은 바보를위한 데모를 적어처럼 할 수 있다면? 소켓에서 연결 한 올바른 사용자에게 보내는 방법도 있습니다.

+0

설명 :

app.use(express.session({ secret: "very secret", store: new RedisStore() // or any other Store })); app.use(passport.session()); 

지금, 당신은 req.user하여 사용자 개체에 액세스 할 수 있습니다 -express-sessions –

+0

내 게시물을 편집 해 주셔서 감사합니다. :-). 좋아,이 세션이 끝나고 나면 끝내주는 데모가 될 것입니다. 이제 소켓 함수에서이 "req"매개 변수에 어떻게 도달 할 수 있는지 묻습니다. 내가 얻을 수있는 유일한 매개 변수는 단지 socket 일 뿐이므로 반환 할 방법을 모른다. 그래서 콘솔 할 수있다. 내가 시도 할 때 : TypeError : Object.stringify (기본)에서 순환 구조체를 JSON 으로 변환 – Izopi4a

답변

3

Passport가 대부분을 처리합니다.

먼저, serializeUserdeserializeUser 방법을 오해했습니다. 앱을 초기화하는 동안 글로벌 헬퍼를 등록하기 위해 한 번 호출해야합니다. Passport는 사용자 객체를 인증 후 user_id로 직렬화하고 사용자가 API에 접근 할 때마다 사용자 객체로 다시 직렬화하기 위해이를 사용합니다.

function check_auth_user(username, password, done){ 
    var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1"; 
    connection.query(sql, function (err, results) { 
    done(err, results[0]) 
    }); 
} 

passport.use(new LocalStrategy(check_auth_user)); 
app.post('/login', passport.authenticate('local', { 
    failureRedirect: '/login', 
    successRedirect: '/' 
})); 

여권 전체 직렬화가 해제 된 사용자와 req.user 채우기, 자동으로 명시 세션에서 user_id을 저장합니다,하지만 당신은 모두 express.sessionpassport.session 미들웨어가 있는지 확인해야합니다 :

passport.serializeUser(function(res, done) { 
    done(null, res.id); 
}); 

passport.deserializeUser(function(id, done) { 
    var sql="SELECT * FROM `table` WHERE id = '"+ id +"' limit 1"; 
    connection.query(sql, function (err, results) { 
    done(err, results[0]) 
    }); 
}); 

그래서, check_auth_user 기능은 정말 간단합니다 사용하도록 설정되었습니다. - http://blog.modulus.io/nodejs-and Express에서 세션을 사용하는 방법에

app.get('/hello', function (req, res) { 
    if (req.user) { 
    res.send('Hello, ' + req.user.username + ', your id is ' + req.user.id); 
    } else { 
    res.send('Hello anonymous'); 
    } 
}); 
+0

이 질문은 정말 재발견 될 것입니다.하지만 저는 실제로 'check_auth_user'와 'passport'사이의 연결 인 undestand를 사용하지 않습니다. . 이 기능이 완료 되었습니까? 그리고 그것이 가능하다면 그것에 관한 문서에 대한 링크를 내놓을 수 있습니다 :-). 그리고 알다시피 socket.io 함수 안에서이 매개 변수 "req"를 얻는 방법은 여전히 ​​있습니다. – Izopi4a

+0

'소켓을 사용하고있는 부분을 놓친 것처럼 보입니다.io'과 http 호출이 아닙니다. 아마도'socket.io'를 통해 인증을 처리하기 위해 추가 모듈이 필요할 것입니다. [passport.socketio module] (https://github.com/jfromaniello/passport.socketio) 및 [이 질문] (http://stackoverflow.com/questions/15093018/sessions-with-express-js)을보아야합니다. -passport-js). –

+0

아, 알았어.하지만 지금 가야 해. 오늘 밤에 시험해 보겠다.하지만 시험해 보니 데모조차도 복잡해 보인다 .--). 문제는 소켓과 다른 vesion이 필요하다는 것입니다. 모듈뿐 아니라이 작업을하기 위해서입니다. 아니면 내가 잘못했을 수도 있습니다. – Izopi4a