2017-10-02 1 views
0

참고 : 비슷한 질문이 많이 있지만 모두 해결했지만 해결 방법은 없습니다.passportjs : user undefined, req.isAuthenticated() is false

안녕하세요, 안녕하세요, 네트워크에서 모든 솔루션을 시도했지만 버그가 계속 발생합니다.

간단한 CRUD 앱을 만들고 있는데, 현재 passportjs의 req.isAuthenticated()에 어려움을 겪고 있습니다. passport.authenticate의 console.log (req.user)가 사용자 개체를 반환하고 req.session.passport에 사용자 ID가 있으므로 사용자가 확실히 인증됩니다.

리디렉션 후에도 리디렉션이 비동기 인 경우에도 사용자는 정의되지 않고 req.session.passport는 비어 있습니다. 마치 세션이 재설정 된 것입니다. 여기

코드입니다 :

는 app.js

var express = require('express'); 
 
var path = require('path'); 
 
var bodyParser = require('body-parser'); 
 
var session = require('express-session'); 
 
var passport = require('passport'); 
 
var flash = require('connect-flash'); 
 

 
var index = require('./routes/index'); 
 
var users = require('./routes/users'); 
 

 
var app = express(); 
 
app.use(bodyParser.json()); 
 
app.use(bodyParser.urlencoded({ 
 
    extended: false 
 
})); 
 

 
app.set('view engine', 'ejs'); 
 
app.set('views', path.join(__dirname, 'views')); 
 

 
app.use(express.static(path.join(__dirname, 'public'))); 
 
app.use('/bootstrap', express.static(path.join(__dirname + '/node_modules/bootstrap/dist'))); 
 

 
app.use(session({ 
 
    secret: 'keyboard cat', 
 
    resave: true, 
 
    saveUninitialized: true, 
 
    cookie: { 
 
    maxAge: 5 * 60 * 1000 
 
    } 
 
})); 
 

 
app.use(passport.initialize()); 
 
app.use(passport.session()); 
 
app.use(flash()); 
 

 
app.use(function(req, res, next) { 
 
    res.locals.messages = require("express-messages")(req, res); 
 
    next(); 
 
}); 
 

 
app.get('*', function(req, res, next) { 
 
    console.log(req.method, ":", req.url); 
 
    res.locals.user = req.user || null; 
 
    next(); 
 
}); 
 

 
app.use("/", index); 
 
app.use("/users", users); 
 

 
var port = 4000; 
 
app.listen(port); 
 
module.exports = app;

하는 index.js

var express = require('express'); 
 
var router = express.Router(); 
 

 
router.get('/', isLoggedIn, function(req, res) { 
 
    if (req.user) { 
 
    console.log(req.user.username); 
 
    } 
 
    res.render('homepage'); 
 
}); 
 

 
function isLoggedIn(req, res, next) { 
 
    console.log("passport: ", req.session.passport); //passport:{} 
 
    if (req.isAuthenticated()) { 
 
    return next(); 
 
    } 
 
    res.redirect('/users/login'); 
 
} 
 

 
module.exports = router;

이 그대로

users.js 내가 어떤 도움을 주셔서 감사합니다 정말 것이다

var express = require('express'); 
 
var router = express.Router(); 
 
var mongojs = require('mongojs'); 
 
var db = mongojs('usersDB', ['users']); 
 
var bcrypt = require('bcryptjs'); 
 
var passport = require('passport'), 
 
    LocalStrategy = require('passport-local').Strategy;​ 
 
router.get('/login', function(req, res) { 
 
    res.render('login'); 
 
});​ 
 
router.get('/signup', function(req, res) { 
 
    res.render('signup'); 
 
});​ 
 
router.post('/signup', function(req, res) { 
 
    db.users.findOne({ 
 
    username: req.body.name 
 
    }, function(err, user) { 
 
    if (err) { 
 
     return done(err); 
 
    } 
 
    if (user) { 
 
     console.log("nope"); 
 
     req.flash("error", "Username taken. Choose a different username."); 
 
     return res.redirect('/users/signup'); 
 
    } 
 
    var password = req.body.password; 
 
    bcrypt.genSalt(10, function(err, salt) { 
 
     if (err) { 
 
     return done(err); 
 
     } 
 
     bcrypt.hash(password, salt, function(err, hash) { 
 
     if (err) { 
 
      return done(err); 
 
     } 
 
     var user = { 
 
      username: req.body.name, 
 
      email: req.body.email, 
 
      phone: req.body.phone, 
 
      password: hash 
 
     } 
 
     db.users.insert(user, function(err, result) { 
 
      if (err) { 
 
      return done(err); 
 
      } 
 
      console.log("registered", user) 
 
      res.render("homepage", { 
 
      user: user 
 
      }); 
 
     }); 
 
     }); 
 
    }); 
 
    }); 
 
}); //sorry for the callback hell..works fine 
 
​​ 
 
passport.serializeUser(function(user, done) { 
 
    return done(null, user._id); 
 
});​ 
 
passport.deserializeUser(function(id, done) { 
 
    db.users.findOne({ 
 
    id: mongojs.ObjectId(id) 
 
    }, function(err, user) { 
 
    return done(err, user); 
 
    }); 
 
});​ 
 
passport.use('loginStrategy', new LocalStrategy({ 
 
    passReqToCallback: true, 
 
    usernameField: 'username', 
 
    passwordField: 'password' 
 
    }, 
 
    function(req, username, password, done) { 
 
    db.users.findOne({ 
 
     username: username 
 
    }, function(err, user) { 
 
     if (err) { 
 
     return done(err); 
 
     } 
 
     if (!user) { 
 
     return done(null, false, req.flash('error', "Invalid username.")); 
 
     } 
 
     bcrypt.compare(password, user.password, 
 
     function isMatch(err, isMatch) { 
 
      if (err) { 
 
      return done(err); 
 
      } 
 
      if (!isMatch) { 
 
      return done(null, false, req.flash('error', "Oops. Incorrect password.")); 
 
      } 
 
      return done(null, user, req.flash('success', "Welcome " + user.username + ", you are now logged in.")); 
 
     }); 
 
    }); 
 
    }​));​ 
 
router.post('/login', function(req, res, next) { 
 
    passport.authenticate('loginStrategy', function(err, user, info) { 
 
    if (info) { 
 
     req.flash('error', info.message); 
 
    } 
 
    if (err) { 
 
     return next(err); 
 
    } 
 
    if (!user) { 
 
     return res.redirect('/users/login'); 
 
    } 
 
    req.logIn(user, function(err) { 
 
     if (err) { 
 
     return next(err); 
 
     } 
 
     //callback redirect after saving session. 
 
     req.session.save(function() { 
 
     console.log(req.session.passport); //{ user: 59ceb263dae7a4270087ae57 } 
 
     res.redirect('/'); 
 
     }); 
 
    }); 
 
    })(req, res, next); 
 
});​ 
 
router.get('/logout', function(req, res) { 
 
    req.logout(); 
 
    res.redirect('/users/login'); 
 
});​ 
 
module.exports = router;

는 일반적인 버그 것 같다,하지만 해결 방법 중 아무도 나를 위해 작동하지 않습니다.

답변

0

이것은 사용자 cred를 저장하는 데 사용하는 메소드와 관련이있는 것 같습니다. Chrome과 IE는 로컬 대 세션 저장에 대해 서로 다른 단점이 있습니다. Chrome에서 이것을 시도하면 Passport JS는 로컬 또는 세션 저장소에 응답을 저장합니다. 사용자의 자격 증명이 있는지 확인하기 위해 저장소 메커니즘을 조사해야합니다.

크롬에서 F12 디버그 도구로 이동 세션 및 로컬 스토리지 보면 :

enter image description here

사용하여 크롬 차이가 있는지 우리가 사용하는 브라우저를 알고 주시기 바랍니다.

+0

감사합니다. 크롬 V61.0.3163.100을 사용하고 있지만 Firefox에서는 작동하지 않습니다. 세션 및 로컬 저장소에 모두 체크인합니다. 둘 다 비어있어 수수께끼 같다. – Nate