使用案例:如果我们获得成功,我们的团队会在某处读取Twitter可能会在我们的服务上插入auth插件,因此我们有一个本地登录策略(电子邮件/密码组合),如果Twitter登录,它可以作为我们用户的备份不管用。这意味着即使浏览器没有存储cookie,用户仍然可以使用电子邮件/密码登录并进行身份验证并获得新的cookie,因此这是一个完全独立的登录过程。
问题:问题是我们不知道如何做到这一点。据我所知,无论您使用何种策略,Passport都会在您每次登录时生成不同的令牌。我们看到的问题是我们的本地策略似乎没有将令牌/ cookie发送回浏览器:
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true // allows us to pass req stream to callback
},
function (req, email, password, done) {
User.findOne({'email': email}, function (err, user) {
if (err) {
done(err);
}
else if (!user) {
done(null, false, req.flash('loginMessage', 'No user found.'));
}
else if (!user.validPassword(password)) {
done(null, false, req.flash('loginMessage', 'Wrong password.')); // create the loginMessage and save it to session as flashdata
}
else {
done(null, user);
}
});
}));
问题:
A: 我相信这个本地登录策略将独立于Twitter登录策略,但我的问题是,我是否需要使用本地策略手动发回cookie?因为它似乎没有设置cookie。
B:我们设置了session:false,但也许我们需要设置session:true,但老实说,从文档中,我无法理解会话代表什么 - 它似乎存储在服务器的内存中,而不是什么我们一般都想要吗?
验证成功后,Passport将建立持久性 登录会话。这对于用户的常见场景非常有用 通过浏览器访问Web应用程序。但是,在某些情况下, 不需要会话支持。例如,API服务器通常 需要为每个请求提供凭据。当这是 例如,通过设置会话可以安全地禁用会话支持 选项为false。
app.get('/api/users/me',
passport.authenticate('basic', { session: false }), //<< session is what exactly?
function(req, res) {
res.json({ id: req.user.id, username: req.user.username });
});
答案 0 :(得分:1)
您需要将session设置为true,因为false用于类似API的身份验证,这需要客户端为每个请求提交凭据。
你需要有一些会话存储,默认情况下express-session
使用的内存存储并不是生产的理想选择。其他会话存储选项有几个模块,如Redis,Mongo等。
Express-session将设置一个名为connect.sid
的cookie,它引用所选会话存储中的session-id(读取:会话信息实际上不存储在cookie中)。您不需要自己设置cookie。
示例会话设置将如下所示(假设您使用Mongodb&amp; Mongoose):
var MongoStore = require('connect-mongo')
mongoose.connect(connectionOptions);
app.use(session({
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
希望这会有所帮助。