【发布时间】:2016-05-29 22:46:19
【问题描述】:
用例:我们的团队在某处读到,如果我们成功了,Twitter 可能会在我们的服务上拔出身份验证插件,因此我们有一个本地登录策略(电子邮件/密码组合),如果 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);
}
});
}));
问题:
答: 我相信这个本地登录策略将独立于 Twitter 登录策略,但我的问题是,我是否需要使用本地策略手动发回 cookie?因为它似乎没有设置 cookie。
B:我们设置了 session:false,但也许我们需要设置 session:true,但老实说,从文档中,我无法理解 session 代表什么 - 它似乎存储在服务器上的内存中,而不是什么我们一般都想要吧?
认证成功后,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 });
});
【问题讨论】:
标签: node.js express cookies twitter-oauth passport.js