推荐答案
## 推荐答案 Passport.js 是一个 Node.js 的身份验证中间件,它支持多种身份验证策略(如本地验证、OAuth、OpenID 等)。以下是使用 Passport.js 进行身份验证的基本步骤: 1. **安装 Passport.js 和相关策略**: ```bash npm install passport passport-local
配置 Passport.js:
// www.javascriptcn.com code example const passport = require('passport'); const 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) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });在 Express 应用中使用 Passport.js:
// www.javascriptcn.com code example const express = require('express'); const session = require('express-session'); const passport = require('passport'); const app = express(); app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session()); app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }) ); app.get('/logout', function(req, res){ req.logout(); res.redirect('/'); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });保护路由:
function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login'); } app.get('/profile', ensureAuthenticated, function(req, res){ res.send('Welcome to your profile!'); });
本题详细解读
1. 安装 Passport.js 和相关策略
Passport.js 本身是一个框架,它依赖于具体的策略来实现身份验证。passport-local 是一个常用的策略,用于处理用户名和密码的本地验证。
2. 配置 Passport.js
- LocalStrategy:这是 Passport.js 提供的一个本地验证策略。你需要提供一个回调函数,该函数会接收用户名和密码,并在数据库中查找用户。如果用户存在且密码正确,则调用
done(null, user)返回用户对象;否则返回错误信息。 - serializeUser 和 deserializeUser:这两个方法用于在会话中存储和检索用户信息。
serializeUser将用户对象序列化为用户 ID,deserializeUser则根据用户 ID 从数据库中检索用户对象。
3. 在 Express 应用中使用 Passport.js
- express-session:Passport.js 依赖于会话管理,因此需要使用
express-session中间件来管理会话。 - passport.initialize() 和 passport.session():这两个中间件用于初始化 Passport.js 并启用会话支持。
- passport.authenticate('local'):这个中间件用于处理登录请求。如果验证成功,用户将被重定向到成功页面;否则重定向到登录页面。
4. 保护路由
- ensureAuthenticated:这是一个自定义的中间件函数,用于检查用户是否已经通过身份验证。如果用户未登录,则重定向到登录页面。