Node.js和Express实现身份认证的过程大致包含以下几个步骤:
- 安装相关插件
在Node.js和Express中,通常使用passport和passport-local插件作为身份认证的工具。可以使用npm安装:
npm install passport passport-local
- 配置身份认证策略
在应用程序的启动文件中(例如 app.js)引入passport和passport-local:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
然后定义本地策略并注册它:
passport.use(new LocalStrategy(
function(username, password, done) {
// 假设我们有一个 users 数据库表,包含以下字段:id、username、password
db.users.findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (user.password !== password) { return done(null, false); }
return done(null, user);
});
}
));
上述代码定义了一个本地策略,它会从我们的数据库中查询数据来验证用户输入的用户名和密码是否正确。findBUsername
函数是假设的,你需要根据实际情况实现一个真正的函数,将它替换掉。
- 应用身份认证中间件
在应用程序的启动文件中,添加以下代码:
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
第一行代码是用来启用express-session中间件的,它是必须的。第二行代码启用passport中间件,第三行代码启用 session 支持。
- 定义路由
要使用身份验证,需要定义至少两个路由:一个用于登录,一个用于处理已登录的用户请求。以下是一个简单的登录路由的示例:
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/dashboard');
});
如果验证成功,它将会返回一个成功的响应。否则,将会重定向到 /login 页面。
- 实现保护路由
在路由的最前面加上 passport.authenticate
方法即可保护该路由,如果用户没有登录,则会自动重定向到登陆页面。以下是一个示例:
app.get('/profile',
require('connect-ensure-login').ensureLoggedIn(),
function(req, res) {
res.render('profile', { user: req.user });
});
在上述代码中,connect-ensure-login
模块用来保护路由,ensureLoggedIn()
方法将检查用户是否登录,如果没有登录,则会重定向到登录页面。
示例1:
const express = require("express");
const app = express();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// 配置登录策略
passport.use(new LocalStrategy(
function(username, password, done) {
// 假设我们有一个 users 数据库表,包含以下字段:id、username、password
db.users.findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (user.password !== password) { return done(null, false); }
return done(null, user);
});
}
));
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
// 登录
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/profile');
});
// 保护路由,需要登录才可以访问
app.get('/profile',
require('connect-ensure-login').ensureLoggedIn(),
function(req, res) {
res.render('profile', { user: req.user });
});
app.listen(3000, () => console.log(`Server started on port 3000`));
示例2:
const express = require("express");
const app = express();
const passport = require('passport');
const FacebookStrategy = require('passport-facebook').Strategy;
// 配置Facebook策略
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://www.example.com/auth/facebook/callback"
},
function(accessToken, refreshToken, profile, done) {
User.findOrCreate({ facebookId: profile.id }, function (err, user) {
return done(err, user);
});
}
));
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
// 登录
app.get('/auth/facebook',
passport.authenticate('facebook'));
app.get('/auth/facebook/callback',
passport.authenticate('facebook', { successRedirect: '/',
failureRedirect: '/login' }));
// 保护路由,需要登录才可以访问
app.get('/profile',
require('connect-ensure-login').ensureLoggedIn(),
function(req, res) {
res.render('profile', { user: req.user });
});
app.listen(3000, () => console.log(`Server started on port 3000`));
以上就是Node.js和Express中实现身份认证的常见方法和步骤。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js express中的身份认证的实现 - Python技术站