如何使用 passportjs 中的会话
How to use the session from passportjs
我可以使用本地护照登录。我想测试护照创建的会话是否有效。我正在从 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);
});
None 以上作品。我得到 res 代码 200,但在 Angular 中的 response.data
中没有任何内容,在节点控制台中的 undefined
中也没有任何内容。
我这样做是因为我认为:
- 用户登录后,Passportjs 创建的会话一直存在,直到被注销销毁。
- 用户登录后,无需创建cookie并将其发送至Angular。 Passport 会自动执行此操作。
- 当Angular发送任何请求时,节点可以访问
req
的会话并验证它自己的会话。
这 3 点我都正确吗?
非常感谢!
编辑
我的猫鼬模式:
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
之前得到的输出
编辑 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);
});
}
));
你是在调用 passport.initialize() 和 passport.session() 吗?
passport.session 是读取 cookie 并将用户存储在 req 对象中的调用。
查看此答案了解更多详情:What does passport.session() middleware do?
您需要更改顺序,将'express session'放在'passport session'之前。它应该以这种方式工作:
app.use(session({
secret: 'mysecret',
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
我可以使用本地护照登录。我想测试护照创建的会话是否有效。我正在从 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);
});
None 以上作品。我得到 res 代码 200,但在 Angular 中的 response.data
中没有任何内容,在节点控制台中的 undefined
中也没有任何内容。
我这样做是因为我认为:
- 用户登录后,Passportjs 创建的会话一直存在,直到被注销销毁。
- 用户登录后,无需创建cookie并将其发送至Angular。 Passport 会自动执行此操作。
- 当Angular发送任何请求时,节点可以访问
req
的会话并验证它自己的会话。
这 3 点我都正确吗?
非常感谢!
编辑 我的猫鼬模式:
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
编辑 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);
});
}
));
你是在调用 passport.initialize() 和 passport.session() 吗? passport.session 是读取 cookie 并将用户存储在 req 对象中的调用。
查看此答案了解更多详情:What does passport.session() middleware do?
您需要更改顺序,将'express session'放在'passport session'之前。它应该以这种方式工作:
app.use(session({
secret: 'mysecret',
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());