21xrx.com
2024-11-05 20:41:53 Tuesday
登录
文章检索 我的文章 写文章
使用Node.js Passport实现登录功能
2023-06-24 00:36:16 深夜i     --     --
Node js Passport 登录功能 认证 用户身份验证

Node.js是一种基于JavaScript的后端平台,能够通过JavaScript编写服务器端代码。Passport是一个第三方身份验证库,用于验证用户的登录信息。在这篇文章中,我们将会学习使用Node.js和Passport实现登录功能。

首先,我们需要使用Node.js和Express创建一个服务器。使用以下的命令来创建一个名为myapp的新Express应用程序:


mkdir myapp

cd myapp

npm init

npm install express --save

接下来,在myapp目录下创建一个名为app.js的JavaScript文件,并将以下代码添加到文件中:


const express = require('express');

const app = express();

app.get('/', (req, res) => {

res.send('Hello World');

});

app.listen(3000, () => {

console.log('Server started on port 3000!');

});

第一行引用了Express模块,该模块允许我们快速轻松地创建Web应用程序。我们将创建一个名为app的常量,并将其设置为我们的Express应用程序的实例。第二行定义了一个路由处理程序,它将处理GET请求并向客户端发送“Hello World”消息。第三行启动我们的服务器并监听3000端口。我们可以通过此命令运行服务器:


node app.js

打开浏览器,输入localhost:3000,我们就可以看到在console中打印出`“Server started on port 3000!”`。现在,我们来配置我们的应用程序让我们可以使用Passport进行身份验证。

Passport支持不同的身份验证策略,包括本地身份验证、社交媒体身份验证、Google身份验证、Facebook身份验证等等。在本文中,我们将使用本地身份验证策略。

我们需要安装以下两个Passport模块:


npm install passport --save

npm install passport-local --save

创建一个名为config.js的文件,并添加以下代码:


module.exports =

'url' : 'mongodb://localhost/passport_local'

;

上述代码将在本地mongodb数据库中创建名为passport_local的数据库。接下来,我们需要将Passport配置为我们的应用程序。使用以下代码将Passport加载到我们的Express应用程序中:


const passport = require('passport');

const LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());

app.use(passport.session());

以上代码将通过app.use()方法将Passport中间件添加到我们的应用程序中。passport.initialize()的作用是初始化Passport模块,而passport.session()则为Passport提供Session支持。

接下来,我们需要配置本地身份验证策略。使用以下代码:


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); }

if (!user.validPassword(password)) { return done(null, false); }

return done(null, user);

});

}

));

上述代码定义了一个本地身份验证策略。我们需要提供一个验证函数,在该函数中我们可以检查用户提供的用户名和密码是否有效。本例中,我们使用User模型中的findOne方法从数据库中查找用户。如果用户存在且密码有效,则调用done函数并将用户对象作为第二个参数传递,否则调用done函数并将false作为第二个参数传递。

最后一步是实现注册和登录路由。对于注册路由,我们需要创建一个名为register.ejs的模板文件,并将以下代码添加到app.js文件中:


const bodyParser = require('body-parser');

const urlencodedParser = bodyParser.urlencoded(

extended: false

);

app.get('/register', function(req, res) {

res.render('register');

});

app.post('/register', urlencodedParser, function(req, res) {

const username = req.body.username;

const password = req.body.password;

const newUser = new User({

username: username,

password: createHash(password)

});

newUser.save(function(err) {

if (err) {

console.log(err);

return res.redirect('/register');

}

return res.redirect('/');

});

});

上述代码定义了一个GET和一个POST路由。当GET路由被请求时,将呈现名为register.ejs的模板文件。当POST路由被请求时,将从请求体中提取用户名和密码,并使用密码哈希值创建一个新的User对象。如果用户成功创建,则重定向到主页。

对于登录路由,我们需要创建一个名为login.ejs的模板文件,并将以下代码添加到app.js文件中:


app.get('/login', function(req, res) {

res.render('login');

});

app.post('/login', passport.authenticate('local',

successRedirect: '/'));

上述代码定义了一个GET和一个POST路由。当GET路由被请求时,将呈现名为login.ejs的模板文件。当POST路由被请求时,使用passport.authenticate()方法,调用本地身份验证策略的验证函数。如果认证成功,则重定向到主页,否则重定向到登录页面。

到这里,我们已经完成了使用Node.js和Passport实现本地身份验证的过程。我们现在可以注册和登录用户,并在成功登录后访问应用程序的受保护部分。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复