gpt4 book ai didi

javascript - Passport.js 用户登录和身份验证

转载 作者:数据小太阳 更新时间:2023-10-29 05:30:02 25 4
gpt4 key购买 nike

在过去的几天里,我一直在使用 Passport.js 开发我的第一个用户登录和身份验证系统。尴尬的是,我已经完成了它并且它按预期工作。问题是,虽然我看了很多文章,在网上查了几十个例子,但我似乎并没有完全理解代码本身。我对理解它背后的过程以及为什么它必须那样发生没有任何问题。如果您能为我澄清部分代码,我将不胜感激。这是工作代码,存储在我的 app.js 文件中:

// Passport session setup
passport.serializeUser(function (user, done) {
done(null, user._id);
});

passport.deserializeUser(function (id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});

// Use the Local Strategy within passport
passport.use(new LocalStrategy(function (username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) {
return done(err);
}

if (!user) {
return done(null, false, { message: 'Unknown user: ' + username});
}

user.comparePassword(password, function(err, isMatch) {
if (err) {
return done(err);
}

if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Invalid Password' });
}
});
});
}));

var app = module.exports = express();

app.configure(function () {
app.set('views', path.join(__dirname + '/views'));
app.set('view engine', 'html');
app.engine('html', hbs.__express);
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({ secret: 'xxx' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname + '/public')));

});

我正在使用 MongoDB(用户 - Mongoose 模型)。此外,为了将密码存储在我目前正在使用 bcrypt 的数据库中。

我认为我在这里不理解的最关键部分是done回调函数。我可以理解它只是传递一些值,而且我知道它的第一个参数是错误,第二个参数是数据。不过,我还没有完全掌握它,因为我没有专门提供一个作为参数。例如,如果我有这样的功能:

// Random Function
var randomFunction = function (a, b, done) {
done(a, b);
};

// Then I would call the randomFunction providing my own **done**
randomFunction('Random', 'Words', function(a, b) { return a + b; });

不过,在我的示例中,我并不是指定 done 回调的人。它只是一个必需的回调函数参数还是与普通中间件中的下一个函数相同,例如:

function middleware (req, res, next) {
next(req.user); // pass the req.user to next middleware
}

此外,Passport.js 在哪里绑定(bind)它处理的用户?它是否将它绑定(bind)到 req.user?我如何将它传递给某些 View 以便显示用户名等?

我期待您的反馈!

谢谢!

最佳答案

完成回调

Local Strategy的代码:

function Strategy(options, verify) {
...
this._verify = verify;
...
}

verify 是策略用来验证用户的函数,您已在此处指定它:

passport.use(new LocalStrategy(function (username, password, done) {
// your verification code here
}));

稍后在策略中您可以找到authenticate从上述步骤调用验证函数的方法:

this._verify(username, password, verified);

因此,您现在看到了 usernamepassworddone==verified 的来源。稍后在您的代码中,您将使用 (err, user, info) 参数调用 done 回调。简而言之,需要done来完成用户验证的异步过程。

req.user 和 views

是的,关于req.user,你是对的。因此,您可以通过两种方式将其传递给您的 View :

  1. 作为res.render 函数的参数。 See docs

    res.render('some-template', { name: req.user });
  2. 使用 res.locals 作为某种上下文提供者(现在用户对象将在 app.router 中定义的所有 View 中可用)。 See docs

    // before app.use(app.router);
    app.use(function(req, res, next) {
    res.locals.user = req.user;
    next();
    });

关于javascript - Passport.js 用户登录和身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19559937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com