Node.js 中使用 Passport 实现用户认证
在 Web 应用程序中,用户认证是必不可少的一部分。Passport 是一个 Node.js 应用程序的认证中间件,它可以帮助你实现多种认证策略,包括本地认证、OAuth、OpenID 等等。在本文中,我们将会介绍如何在 Node.js 中使用 Passport 实现用户认证。
安装 Passport
首先,我们需要使用 npm 安装 Passport:
npm install passport
同时,我们也需要安装我们所需要的认证策略。例如,如果我们想要使用本地认证策略,我们需要安装 passport-local:
npm install passport-local
实现本地认证
在本地认证中,用户的用户名和密码是存储在我们的应用程序中的。我们需要验证用户输入的用户名和密码是否正确,如果验证通过,我们就可以认为用户已经通过了认证。
首先,我们需要在我们的 Node.js 应用程序中引入 Passport:
const passport = require('passport');
然后,我们需要配置 Passport。我们需要告诉 Passport 如何从请求中获取用户的用户名和密码,并且告诉它如何验证这些信息。
passport.use(new LocalStrategy( function(username, password, done) { // 在这里验证用户名和密码,如果验证通过,调用 done(null, user)。 // 如果验证失败,调用 done(null, false)。 } ));
在这里,我们使用了 passport-local 模块提供的 LocalStrategy。LocalStrategy 接收一个函数作为参数,这个函数接收用户输入的用户名和密码,并且需要调用 done 函数告诉 Passport 验证结果。如果验证通过,我们需要将用户对象作为第二个参数传递给 done 函数,如果验证失败,我们需要将 false 作为第二个参数传递给 done 函数。
接下来,我们需要告诉 Passport 如何将用户对象序列化和反序列化。序列化是将用户对象转换为一个字符串,反序列化是将这个字符串转换回用户对象。这个过程是为了实现用户会话。
passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { // 在这里根据 id 查找用户对象,如果找到了,调用 done(null, user)。 // 如果找不到,调用 done(new Error('User not found')); });
在这里,我们将用户对象的 id 作为序列化结果。在反序列化的时候,我们需要根据这个 id 查找用户对象并且返回。
最后,我们需要在我们的应用程序中使用 Passport。我们需要在处理用户登录的路由中调用 Passport 的 authenticate 方法:
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
在这里,我们使用了 passport.authenticate 方法来处理用户登录请求。它接收两个参数:认证策略的名称和一个选项对象。在选项对象中,我们可以指定登录成功后跳转到哪个页面,登录失败后跳转到哪个页面。
示例代码
下面是一个完整的例子,演示了如何使用 Passport 实现本地认证:
// javascriptcn.com 代码示例 const express = require('express'); const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy( function(username, password, done) { if (username === 'admin' && password === '123456') { return done(null, { id: 1, username: 'admin' }); } else { return done(null, false); } } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { if (id === 1) { return done(null, { id: 1, username: 'admin' }); } else { return done(new Error('User not found')); } }); app.get('/', function(req, res) { res.send('Hello, ' + req.user.username); }); app.get('/login', function(req, res) { res.send(` <form method="post" action="/login"> <input type="text" name="username" placeholder="Username" /> <input type="password" name="password" placeholder="Password" /> <button type="submit">Login</button> </form> `); }); app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); app.listen(3000, function() { console.log('App listening on port 3000'); });
在这个例子中,我们使用了一个简单的用户名和密码进行验证。在实际应用中,我们需要将用户名和密码存储在数据库中,并且使用数据库查询来验证用户输入的信息。
总结
Passport 是一个非常强大的认证中间件,它可以帮助我们实现多种认证策略。在本文中,我们介绍了如何使用 Passport 实现本地认证,并且提供了一个完整的示例代码。在实际应用中,我们需要根据具体的需求来选择合适的认证策略,并且注意保护用户的隐私信息。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6587e82aeb4cecbf2dd1b7d1