本地护照策略加上Twitter策略

时间:2016-02-17 23:51:00

标签: node.js express cookies twitter-oauth passport.js

使用案例:如果我们获得成功,我们的团队会在某处读取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 });
  });

1 个答案:

答案 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 })
}));

希望这会有所帮助。