【问题标题】:Local Passport strategy coupled with Twitter Strategy本地护照策略与 Twitter 策略相结合
【发布时间】: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


    【解决方案1】:

    您需要将 session 设置为 true,因为 false 用于类似 API 的身份验证,需要客户端为每个请求提交其凭据。

    您需要有一些会话存储,默认情况下express-session 使用内存存储,这对于生产来说并不理想。有几个模块用于其他会话存储选项,如 Redis、Mongo 等。

    Express-session 将设置一个名为 connect.sid 的 cookie,它引用您选择的会话存储中的会话 ID(阅读:会话信息实际上并未存储在 cookie 中)。您不需要自己设置 cookie。

    一个示例会话设置如下所示(假设您使用 Mongodb 和 Mongoose):

    var MongoStore = require('connect-mongo')
    mongoose.connect(connectionOptions);
    
    app.use(session({
        store: new MongoStore({ mongooseConnection: mongoose.connection })
    }));
    

    希望这会有所帮助。

    【讨论】:

    • 好的,谢谢,是的,我们正在使用 cookie-session,但真正让我感到困惑的是,我们将 twitter 策略的 session 设置为 false,但它并不要求我们每次都使用 twitter 登录
    • 我不确定将 session 设置为 false 对 twitter 策略有什么作用。据我所知,passport-authenticate 成功后,用户的会话被更新(在你的情况下,cookie)。
    • 我猜为什么 twitter-strategy 和 local-strategy WRT session 是真还是假之间会有区别。将 session 设置为 true 或 false 应该对这两种策略产生相同的效果吧?
    • 刚刚检查过,我是对的,需要会话。 OAuth 1.0A(twitter 使用的版本)需要一个每笔交易的“秘密”,在重定向之前交换并在重定向之后进行验证。此密钥存储在会话中,因此任何基于 OAuth 1.0 的策略都需要会话。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2020-01-04
    相关资源
    最近更新 更多