2017-12-29 10 views
3

나는 을 가지고 있습니다. PassportJS으로 설정되었습니다. Google+ 로그인.PassportJs isAuthenticated not authenticating

Google 인증은 정상적으로 작동하지만 인증 된 사용자 만 액세스 할 수있는 페이지로 리디렉션 할 때 표시됩니다. 여권의 isAuthenticated() 함수는 항상 나는 사람들이 당신이 콘솔 로깅하여 사용자 찾을 수 있어야 언급 본 적이 false

반환하는 것 같다 req.session.passport.user를하지만 콘솔 때 얻을 모두가 req.session 로그 :

sessionID: 'Q5NaeyfnAphOK633tKjiGnbbex0KJj7e', 
    session: 
    Session { 
    cookie: 
     { path: '/', 
     _expires: null, 
     originalMaxAge: null, 
     httpOnly: true } }, 

구글 콜백을 제공

router.get("/google/callback", function(req, res, next) { 
    passport.authenticate("google", function(err, user, info) { 
     req.session.save(()=>{ 
      res.redirect("/api/v1/dashboard"); 
      console.log("after Passport AUTH"); 
     }); 
    })(req, res, next); 
}); 

참고 : 나는 세션 수 있도록 수동 req.session.save()를 추가했습니다 구원 중입니다.

대시 보드 경로 :

router.get("/", middleware.isLoggedIn , function(req, res) { 
    console.log("Request: Get All Dashboard Data!"); 
    models.PortfolioBalance.findAll({ raw: true }).then(function(
     portfolioBalance 
    ) { 
     res.render("dashboard/index", { portfoliobalances: portfolioBalance }); 
    }); 
}); 

미들웨어 모듈 :

module.exports = { 
    isLoggedIn: function(req, res, next) { 
     console.log("==========================================="); 
     console.log("isAuthenticated: ", req.isAuthenticated); 
     console.log("==========================================="); 
     if (req.isAuthenticated()) { 
      return next(); 
     } 
     console.log("not authenticated"); 
     res.redirect("/login"); 
    } 
}; 

직렬화 및 역 직렬화를 :

// used to serialize the user for the session 
passport.serializeUser(function(user, done) { 
    console.log("SerializeUser:", models.User.userId); 
    done(null, user.id); 
}); 

// used to deserialize the user 
passport.deserializeUser(function(id, done) { 
    console.log("deserializeUser:", models.User.userId); 
    models.User.findOne({ where: { userId: id } }).then(function(
     err, 
     user 
    ) { 
     done(err, user); 
    }); 
}); 

잠재적 인 문제 :

  • 그것이 passportJS가 serialising 제대로 deserialising하지에 문제가 될 수 있을까? 왜? 왜냐하면 나는 인증 과정에서 어느 시점에서든 console.log 메시지가 실행되는 것을 보지 못하기 때문이다.

답변

5

먼저 미들웨어로 인증을 사용하여 경로를 보호하고 로그인하는 것이 좋습니다. 당신은 사용자를 검색 할 위치를 당신이 당신이 그것을 설정할 수 있습니다 로그인 경우처럼

// put in a separate file and then import where you need it for this example lets say auth.js 
module.exports = function(){ 
    return { 
     authenticate: passport.authenticate('google', function (err,user){ 
      if(err) 
       res.redirect('/login'); 
      if(user) 
       res.redirect("/api/v1/dashboard"); 
     })(req,res); 
    } 
}; 

은 그래서 구글 전략의 내부

// where you have your routing 
var auth = require('path_to_auth.js')(); 

router.post('/login', auth.authenticate); 

이다.

// from the passport-google npmjs.com documentation adjust for the actual strategy you use 
passport.use(new GoogleStrategy({ 
    returnURL: 'http://localhost:3000/auth/google/return', 
    realm: 'http://localhost:3000/' 
    }, 
    function(identifier, done) { 
    User.findByOpenID({ openId: identifier }, function (err, user) { 
     return done(err, user); 
    }); 
    } 
)); 
또한 다음 직렬화 등

var User = mongoose.model('User', UserSchema); // adjust to your schema 

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

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 
처럼 역 직렬화 사용자 모델을 가져와야합니다