在 Web 应用中,用户权限认证是一项非常重要的功能,它可以保护用户的隐私和数据安全。Node.js 是一个非常流行的服务器端 JavaScript 运行环境,而 Express 是一个基于 Node.js 的 Web 应用框架,它提供了方便快捷的路由、中间件等功能。Passport 是一个 Node.js 的用户认证中间件,它可以帮助我们实现用户登录、注册、退出等功能。本文将介绍如何使用 Node.js + Express + Passport 实现用户权限认证的方法,并提供示例代码,帮助读者快速学习和理解。
1. 安装和配置
在开始之前,我们需要安装 Node.js 和 Express,并创建一个新的项目。可以使用以下命令:
npm install express-generator -g express myapp cd myapp npm install
接下来,我们需要安装 Passport 和相关的认证策略。可以使用以下命令:
npm install passport passport-local passport-jwt bcrypt jsonwebtoken
Passport 支持多种认证策略,包括本地认证、OAuth 认证、JWT 认证等。在本文中,我们将使用本地认证和 JWT 认证实现用户权限认证。
2. 实现本地认证
本地认证是一种基于用户名和密码的认证方式。在 Express 中,可以使用 passport-local 策略实现本地认证。首先,我们需要在 app.js 中配置 Passport:
// javascriptcn.com 代码示例 // app.js var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy( function(username, password, done) { // 在这里实现本地认证逻辑 } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { // 在这里实现用户反序列化逻辑 });
其中,passport.initialize() 和 passport.session() 是必须的中间件,用于初始化 Passport 和启用会话支持。passport.use() 用于注册一个认证策略,这里我们使用了 passport-local 策略,并实现了认证逻辑。passport.serializeUser() 和 passport.deserializeUser() 分别用于将用户对象序列化和反序列化,以便在会话中存储和检索用户信息。
接下来,我们需要在路由中使用 Passport 进行本地认证:
// routes/index.js var passport = require('passport'); router.post('/login', passport.authenticate('local', { failureRedirect: '/login' }), function(req, res) { res.redirect('/'); });
这里我们定义了一个 POST 请求的路由,用于处理用户登录。passport.authenticate() 是 Passport 提供的认证中间件,它接收一个认证策略的名称,这里是 local,表示本地认证。如果认证成功,将会执行后面的回调函数,否则将会重定向到登录页面。最后,我们使用 res.redirect() 将用户重定向到主页。
3. 实现 JWT 认证
JWT 认证是一种基于 JSON Web Token 的认证方式。在 Express 中,可以使用 passport-jwt 策略实现 JWT 认证。首先,我们需要在 app.js 中配置 Passport:
// javascriptcn.com 代码示例 // app.js var passport = require('passport'); var JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; var opts = {} opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = 'secret'; passport.use(new JwtStrategy(opts, function(jwt_payload, done) { // 在这里实现 JWT 认证逻辑 }));
其中,passport-jwt 提供了 ExtractJwt 来从请求头中提取 JWT,以及 JwtStrategy 来实现 JWT 认证逻辑。opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken() 表示从请求头的 Authorization 字段中提取 JWT。opts.secretOrKey = 'secret' 表示 JWT 的签名密钥。
接下来,我们需要在路由中使用 Passport 进行 JWT 认证:
// javascriptcn.com 代码示例 // routes/api.js var passport = require('passport'); var jwt = require('jsonwebtoken'); router.post('/login', function(req, res) { // 在这里实现用户登录逻辑,生成 JWT var token = jwt.sign({ id: user.id }, 'secret', { expiresIn: '1h' }); res.json({ token: token }); }); router.get('/profile', passport.authenticate('jwt', { session: false }), function(req, res) { res.json(req.user); });
这里我们定义了一个 POST 请求的路由,用于处理用户登录。在登录成功后,我们使用 jwt.sign() 生成 JWT,并将其返回给客户端。在 GET 请求的路由中,我们使用 passport.authenticate() 进行 JWT 认证,如果认证成功,将会执行后面的回调函数,否则将会返回 401 错误。在回调函数中,我们可以通过 req.user 获取当前用户的信息。
4. 实现用户权限控制
用户权限控制是一项非常重要的功能,它可以限制不同用户对不同资源的访问权限。在 Express 中,可以使用中间件来实现用户权限控制。首先,我们需要定义一个中间件,用于检查用户的权限:
// javascriptcn.com 代码示例 // middleware/checkPermission.js module.exports = function(permission) { return function(req, res, next) { if (req.user && req.user.permissions && req.user.permissions.indexOf(permission) !== -1) { next(); } else { res.status(403).json({ message: 'Forbidden' }); } } }
这里我们定义了一个 checkPermission 中间件,它接收一个权限参数,并返回一个中间件函数。在中间件函数中,我们首先检查当前用户是否存在,以及用户是否具有指定的权限,如果是,则调用 next() 继续执行下一个中间件或路由,否则返回 403 错误。
接下来,我们可以在路由中使用 checkPermission 中间件来实现用户权限控制:
// routes/api.js var checkPermission = require('../middleware/checkPermission'); router.get('/admin', passport.authenticate('jwt', { session: false }), checkPermission('admin'), function(req, res) { res.json({ message: 'Hello, admin' }); });
这里我们定义了一个 GET 请求的路由,用于访问管理员页面。在中间件链中,我们首先使用 passport.authenticate() 进行 JWT 认证,然后使用 checkPermission('admin') 中间件进行权限控制,只有具有 admin 权限的用户才能访问该页面。
5. 总结
本文介绍了如何使用 Node.js + Express + Passport 实现用户权限认证的方法,并提供了详细的示例代码。通过本文的学习,读者可以了解到 Passport 的基本使用方法,以及如何实现本地认证和 JWT 认证、用户权限控制等功能。同时,本文还提供了一些实用的中间件代码,帮助读者快速实现自己的 Web 应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6561de99d2f5e1655dbe837a