【问题标题】:Passport.js strategy with no field required无需字段的 Passport.js 策略
【发布时间】:2015-05-22 16:57:18
【问题描述】:

我很惊讶它这么难找到,或者我可能有问题。

我需要一个不需要字段的 passport.js strategy - 对简单用户 GET'/' 的请求运行身份验证并操纵用户会话数据,例如,创建一个新的“访客”用户.

也许我可以通过护照local-strategy 做到这一点?还是我需要创建一个自定义的?

我看到了这个Configure Passport to accept request without body? 问题,但我只是无法弄清楚答案包装中的建议将如何改变任何事情。

编辑:这就是我想要实现的目标

 passport.use('guest', new LocalStrategy({
    passReqToCallback: true
},
function (req, NOusername, NOpassword, done) {
////NO PASSWORD OR USERNAME checks here, just deciding what kind of temporary user needs to be created///
if (req.session.passport) {
  ///create new user with previous session data
  done(null,user)
}
else {
   ///create clean user
   done(null, user)
})
)

然后在routes.js

app.get('/', passport.authenticate('guest'), function (req, res) {        
    res.render('PeerRoom.ejs', req.user);        
});

【问题讨论】:

    标签: node.js express passport.js passport-local


    【解决方案1】:

    编辑:另一种方法是使用 req.logIn 并完全跳过处理策略

    app.get('/', yourCustomGuestAuthenticationMiddleware, function (req, res) {        
        res.render('PeerRoom.ejs', req.user);        
    });
    function yourCustomGuestAuthenticationMiddleware(req, res, next){
        // No need to do anything if a user already exists.
        if(req.user) return next();
    
        // Create a new user and login with that
        var user = new User({name: 'guest'+Math.random().toString() });
        user.save();
        req.logIn(user, next);
    }
    

    要创建新的访客用户,只需执行此操作而不是拒绝身份验证

    这是修改后的example from the docs

    var passport = require('passport'),
        LocalStrategy = require('passport-local').Strategy;
    
    passport.use(new LocalStrategy(
        function(username, password, done) {
            User.findOne({ username: username }, function(err, user) {
                if (err)  return done(err);
                if (!user) {
    
                    /* HERE, INSTEAD OF REJECTING THE AUTHENTICATION */
                    // return done(null, false, { message: 'Incorrect username.' });
    
                    /* SIMPLY CREATE A NEW USER */
                    var user = new User({ name: 'guest'+Math.random().toString() });
                    user.save();
                    /* AND AUTHENTICATE WITH THAT */
                    return done(null, user);
    
                }
                if (!user.validPassword(password)) {
                    return done(null, false, { message: 'Incorrect password.' });
                }
                return done(null, user);
            });
        }
    ));
    

    【讨论】:

    • 问题是我试图在没有验证本身的情况下执行此操作,即我想创建新的访客用户而不检查密码和用户名,更多的用户名和密码是根本没有提供,我想在对主页的简单 GET 请求上运行此策略
    • 添加了一个代码片段,代表我想要实现的目标
    • 老实说,在护照中的登录功能做什么之前,我从来没有完全理解过,我做对了吗,您可以为它提供自定义用户,它会将这个用户直接扔到序列化/反序列化护照会话管道中。如果是这样,那我觉得有点傻
    • 我的网络应用程序也是由套接字驱动的,它在用户得到“/”后不久打开,并在他离开时关闭。因此,现在我在套接字连接上实现了这个用户临时访客(只是手动创建并添加到会话中,与护照分开)并留下护照只是为了方便的注册/登录策略。如果我正确理解login() 的工作流程,那么我需要重新考虑这一点,但目前看不出这种方法有什么大的不同。啊,无论如何只是一个想法。
    猜你喜欢
    • 2018-11-10
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2012-10-04
    • 1970-01-01
    • 2015-01-01
    • 2017-09-18
    相关资源
    最近更新 更多