2017-12-29 43 views
3

私はPassportJSと設定していますを持っています。PassportJs isAuthenticated not authenticating

Google認証は正常に機能しているようですが、認証されたユーザーだけがアクセスできるページにリダイレクトしたときです。 req.session.passport.user私はreq.sessionを記録慰めるときに私が得るすべては次のとおりです:

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

パスポートのisAuthenticated()関数は常に私は、人々はあなたがコンソールロギングによって、ユーザーを見つけることができる必要があることに言及見てきましたfalse

を返すように見えますGoogleのコールバックルート:

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を直列化し、適切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); 
    } 
}; 

はように、Googleの戦略の内部

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

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

です。あなたはまた、シリアライズしそう

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); 
    }); 
}); 
のようにデシリアライズし、ユーザーモデルをインポートする必要があり

// 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); 
    }); 
    } 
)); 

関連する問題