使用 Express.js 和 Passport 实现用户认证
在前端开发中,用户认证是必不可少的。无论是应用程序还是网站,都需要用户登录来保证数据的安全性和隐私。
本文将介绍如何使用 Express.js 和 Passport 实现用户认证,包括注册、登录、注销和保护路由等内容。
- 安装和配置
首先,我们需要安装 Express.js 和 Passport。请在终端输入以下命令进行安装:
npm install express passport passport-local express-session --save
接着,配置 Passport 和 Session。在主文件中加入以下代码:
const express = require('express'); const passport = require('passport'); const session = require('express-session'); const app = express(); app.use(session({ secret: 'secret', resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session()); passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { User.findById(id, (err, user) => { done(err, user); }); });
- 注册和登录
接下来,我们需要创建路由和处理程序来实现注册和登录。在路由中添加以下代码:
const express = require('express'); const router = express.Router(); const passport = require('passport'); const User = require('../models/user'); router.get('/register', (req, res) => { res.render('register'); }); router.post('/register', (req, res) => { const newUser = new User({ username: req.body.username }); User.register(newUser, req.body.password, (err, user) => { if (err) return res.render('register'); passport.authenticate('local')(req, res, () => { res.redirect('/'); }); }); }); router.get('/login', (req, res) => { res.render('login'); }); router.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); router.get('/logout', (req, res) => { req.logout(); res.redirect('/'); }); module.exports = router;
在这段代码中,我们首先引入了 Express、Passport 和 User 模型。然后,我们通过路由来创建注册和登录的处理程序。其中,register()
函数通过用户提供的用户名和密码来创建一个新的用户,并将其保存到数据库中。如果创建失败,则返回注册页面。authenticate()
函数是 Passport 中间件的一种方法,用来验证用户的身份。如果验证成功,就将用户信息保存到 session 中,并跳转到首页。相应地,在登录路由中,我们直接调用 authenticate()
函数,并在验证失败时,将用户重定向到登录页面。注销路由仅需调用 logout()
函数并重定向到首页即可。
- 保护路由
在许多应用程序中,一些路由需要用户登录才能访问。为了实现此功能,我们可以编写一个中间件来检查用户是否已经登录。以下是一个简单的中间件实现:
function isLoggedIn(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login'); }
在我们需要保护的路由中,我们将其作为中间件传递:
router.get('/dashboard', isLoggedIn, (req, res) => { res.render('dashboard', { user: req.user }); });
在这个例子中,/dashboard
路由需要用户登录才能访问。因此,我们将 isLoggedIn
中间件传递给路由,如果用户已经登录,就会渲染一个带有用户信息的页面,否则会重定向到登录页面。
- 总结
使用 Express.js 和 Passport 实现用户认证可以轻松保护应用程序中的数据。本文介绍了如何在 Express 应用程序中配置 Passport 和 Session,以及如何使用 Passport 完成用户的注册、登录和注销。我们还介绍了如何保护路由,并提供了一些示例代码,可以帮助你快速上手开发。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65af562aadd4f0e0ff8c0a21