2014-03-27 6 views
1

NodeJS 및 여권 facebook과 redis 통합 문제가 하나 있습니다. NodeJS + Redis + Express + Passport Facebook 인증 실패

당신은 어떤 생각을 가지고 있습니까 ...

var express = require('express'); 
var engine = require('ejs').__express; 
var app = express(); 
var mongo = require('mongodb'); 
var mongoose = require('mongoose'); 
var hanzi = require('./modules/hanzi'); 
var session = require('express-session'); 
var passport = require('passport') 
, FacebookStrategy = require('passport-facebook').Strategy 
, RedisStore = require('connect-redis')(session) 
, redis = require('redis') 
, dbRedis = redis.createClient(); 

Server = mongo.Server, 
Db = mongo.Db, 
BSON = mongo.BSONPure; 


app.configure(function() { 

    var sessionStore = new RedisStore({ 
     client: dbRedis, 
    }); 

    app.set('port', process.env.PORT || 8088); 
    app.set('views', __dirname+'/views'); 
    app.engine('ejs', engine); 
    app.use(express.favicon(__dirname + '/public/img/favicon.ico')); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
     secret: 'im your besta' , 
     cookie: {secure: true, maxAge:86400000}, 
     store: sessionStore 
    })); 
    app.use(express.logger('dev')); 
    app.use(express.json()); 
    app.use(express.urlencoded()); 
    app.use('/public', express.static(__dirname + '/public')); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
}); 

하지만 난 페이스 북 덕분에 로그인 할 때, 나는 올바른 사용자가 done(null,oldUser);를 사용 찾을 내 ensureAuthenticated() 함수는 항상 false입니다 : 이것은 내 코드입니다 ?

미리 감사드립니다.

편집 : ... 어떤 생각 추가 레디 스 내가 너무 많은 쿠키를 추가 할 이유를 모르겠어요

+1395994580.698685 (db 2) "setex" "sess:Od0RD3AcyIhTMUynnlDQobEr" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:20.698Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}" 
+1395994582.099713 (db 2) "setex" "sess:OT1Rht88PPbeMDnKvYjMmGlC" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.099Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.102495 (db 2) "setex" "sess:nu6Pm2xb4SFpf8IPNFz7oBUa" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.102Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.104810 (db 2) "setex" "sess:qckQqsbZsEWCrpA1dJEvRdsa" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.104Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.109756 (db 2) "setex" "sess:WmXRkw2GKWx8DRz25RIwMOWJ" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.109Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.112338 (db 2) "setex" "sess:3WkCT4YqL1mpeyHXiBwjpWpR" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.112Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.117175 (db 2) "setex" "sess:yKaQ2Z5QJaC8UG1dw2q0sZMo" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.117Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.248297 (db 2) "setex" "sess:m2xlPaDlFCnVelxFnvmWEnKJ" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.248Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.964619 (db 2) "setex" "sess:XWQeeUCS7JUZTPzxZSMxqUpR" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:22.964Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994582.970229 (db 2) "setex" "sess:LqgRcHrnIaXfXVceHgdZ6FlN" "86399" "{\"cookie\":{\"originalMaxAge\":86399999,\"expires\":\"2014-03-29T08:16:22.969Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994588.902167 (db 2) "setex" "sess:qXO9gBrHu8vp64UyKYJHWcCq" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:28.900Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}" 
+1395994590.304890 (db 2) "setex" "sess:JA4KfLN92wVIYrcOyhZeQw2O" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:30.304Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"52de69b0c432647c5fc6309c\"}}" 
+1395994590.690489 (db 2) "setex" "sess:Vc6Z6oLnnxGqqzItuEWpO8ab" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:30.690Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}" 
+1395994591.582708 (db 2) "setex" "sess:XIud7BMHoPjJ0BFf6AMkrJV9" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.582Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.585150 (db 2) "setex" "sess:IlHl8a7QDp2g9UpXAmYHOk09" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.585Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.631536 (db 2) "setex" "sess:jeLL5UZkPXEeK8K3mbCaBwrl" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.631Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.634714 (db 2) "setex" "sess:xIgC6NKShHW8ewG8YGSCm0vn" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.634Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.638343 (db 2) "setex" "sess:SxfiYe5TBeUGrNQ4z3MPIBHe" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.638Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.953461 (db 2) "setex" "sess:JK0nt4aD0ycED0kjiAEPZEPD" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.953Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994591.987201 (db 2) "setex" "sess:B6TOzQWvBo8HiN55so28iL8X" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:31.987Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994592.033600 (db 2) "setex" "sess:BoQODHZ8kjgqczNAe7By8kEs" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:32.033Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 
+1395994592.036671 (db 2) "setex" "sess:lmeCXBZUr0dw38iozFNOBayK" "86400" "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-03-29T08:16:32.036Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"}}" 

로그 : 직렬화/

passport.serializeUser(function(user, done) { 
        console.log("serialize user"); 
        console.log(user._id); 
        done(null, user._id); 
       }); 

passport.deserializeUser(function(obj, done) { 
        console.log("deserialize user"); 
        done(null, obj); 
       }); 

passport.use(new FacebookStrategy({ 
        clientID: "xxx", 
        clientSecret: "xxxx", 
        callbackURL: "http://myurl/auth/facebook/callback" 
       }, 
       function(accessToken, refreshToken, profile, done) { 

        db.collection('fbs', function(err, collection) { 
         collection.findOne({fbId : profile.id}, function(err, oldUser) { 
          if(oldUser){ 
           console.log("OK"); 
           console.log(oldUser); 
           done(null,oldUser); 
          }else{ 
           console.log("NEW USER"); 
           var newUser = new FbUsers({ 
            fbId : profile.id , 
            email : profile.emails[0].value, 
            name : profile.displayName 
           }).save(function(err,newUser){ 
            if(err) throw err; 
            done(null, newUser); 
           }); 
          } 
         }); 

        }); 
       } 
       )); 

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/') 
} 

EDIT 2 역 직렬화 ?

+0

당신은 완료 여권 구성 코드 및 ensureAuthenticated() 함수 –

+0

를 추가시겠습니까! 감사합니다. – Immikims

+0

'passport.deserializeUser()'에서 사용자 아이디 (즉,'obj')로 사용자 객체'user'를 찾고'done (null, user);'을 호출해야합니다. – bnuhero

답변

1

serializeUser 함수는 여권에서 제공하는 req.logIn 함수에 의해 사용됩니다.

req.login = 
req.logIn = function(user, options, done) { 
    if (typeof options == 'function') { 
    done = options; 
    options = {}; 
    } 
    options = options || {}; 

    var property = 'user'; 
    if (this._passport && this._passport.instance) { 
    property = this._passport.instance._userProperty || 'user'; 
    } 
    var session = (options.session === undefined) ? true : options.session; 

    this[property] = user; 
    if (session) { 
    if (!this._passport) { throw new Error('passport.initialize() middleware not in use'); } 
    if (typeof done != 'function') { throw new Error('req#login requires a callback function'); } 

    var self = this; 
    this._passport.instance.serializeUser(user, this, function(err, obj) { 
     if (err) { self[property] = null; return done(err); } 
     self._passport.session.user = obj; 
     done(); 
    }); 
    } else { 
    done && done(); 
    } 
}; 

이 req.logIn 함수는 세션에서 직렬화 된 사용자를 유지하고 로그인을 수행하기 위해 호출 할 수 있습니다. 이 함수는 정의 된 전략에 따라 사용자를 가져온 후이를 호출하는 passport.authenticate 함수에 의해 자동으로 호출됩니다.

여권 전략 작성 여권에 대한 절차를 만들어 사용자를 찾지 만 자체적으로 로그인을 수행하지는 않습니다 . isAuthenticated는 로그인이 일어나지 않으므로 false입니다.

그래서 페이스 북의 전략을 사용하여 사용자를 찾아 자동으로 수행이 경로 여권에가는 지금이 당신의 경로로 이런 일을 추가,

app.get('/auth/facebook', passport.authenticate('facebook', { state: 'SOME STATE' })); 

당신의 페이스 북의 인증 전략에 대한 인증 경로를 만들 수 있습니다 이 사용자의 로그인 당신의 페이스 북의 stragtegy 가정하면 .. 그냥 잘 오류 작동하지해야했다

..