如何使用passportjs会话

时间:2017-03-24 01:53:09

标签: angularjs node.js session passport.js passport-local

我可以使用本地护照登录。我想测试护照创建的会话是否有效。我从Angular登录。当用户登录时,我不会创建任何手动cookie,但会看到创建了connect.sid cookie。现在从Angular我发送另一个req

$scope.test = function(){
    $http.get('\test').then(function(response){
        if(response){
            console.log(response);
        } else {
            console.log("Nothing Returned!");
        }
    });
}

在节点中:

app.use(session({
    secret: 'mysecret',
    resave: true,
    saveUninitialized: true
}));


//Passport Init
app.use(passport.initialize());
app.use(passport.session());

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


passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
         done(err, user);
    });
});


app.get('\test', function(req, res){

   //Tried the following (one at a time) : 
    var user = req.user;
    var user = req[user];
    var user = req["user"];
    var user = req.session;

    console.log(user);
    res.send(user);

});

以上都不奏效。我得到res代码200,但在Angular的response.data中没有,在节点控制台的undefined中没有任何内容。

我这样做是因为我认为:

  1. 用户登录后,Passportjs会创建会话,直到通过注销销毁为止。
  2. 用户登录后,无需创建cookie并将其发送给Angular。 Passport会自动执行此操作。
  3. 当Angular发送任何请求时,节点可以访问req的会话并使用它自己的会话进行验证。
  4. 我对所有这三点都是正确的吗?

    非常感谢!

    修改 我的猫鼬模式:

    var UserSchema = mongoose.Schema({
        id : {type:String, default:"abc123"},
        username: {type:String, index: true},
        password: String,
        email: {type:String, unique:true}
    });
    
    module.exports = mongoose.model('User', UserSchema);
    

    编辑2 添加在express session

    之前放置passport session时获得的输出

    enter image description here

    编辑3 我的策略:

    passport.use(new LocalStrategy(
        function(username, password, done){
            User.findOne({username: username}, function(err, doc){
                if(err) {
                    // console.log(err);
                    return done(err);
                }
                return done(null, doc);
            });
        }
    ));
    

2 个答案:

答案 0 :(得分:1)

您需要更改订单,在“护照会话”之前加上“快速会议”。它应该以这种方式工作:

app.use(session({
    secret: 'mysecret',
    resave: true,
    saveUninitialized: true
}));

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

http://passportjs.org/docs/configure

答案 1 :(得分:0)

您是否正在调用passport.initialize()和passport.session()? passport.session是读取cookie并将用户存储在req对象中的调用。

查看此答案以获取更多详细信息:What does passport.session() middleware do?