推荐答案
// www.javascriptcn.com code example
const express = require('express');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
const app = express();
// 配置 session
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false
}));
// 初始化 Passport
app.use(passport.initialize());
app.use(passport.session());
// 配置本地策略
passport.use(new LocalStrategy(
function(username, password, done) {
// 这里应该是你的用户验证逻辑
if (username === 'user' && password === 'password') {
return done(null, { id: 1, username: 'user' });
} else {
return done(null, false, { message: 'Incorrect username or password.' });
}
}
));
// 序列化用户
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// 反序列化用户
passport.deserializeUser(function(id, done) {
// 这里应该是你的用户查找逻辑
done(null, { id: 1, username: 'user' });
});
// 登录路由
app.post('/login',
passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })
);
// 主页路由
app.get('/', (req, res) => {
res.send('Welcome to the home page!');
});
// 登录页面路由
app.get('/login', (req, res) => {
res.send('Please login');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});本题详细解读
1. 安装依赖
首先,你需要安装 express、passport、passport-local 和 express-session 这些依赖包。可以通过以下命令安装:
npm install express passport passport-local express-session
2. 配置 Session
express-session 用于管理用户的会话。你需要配置一个 secret 密钥,用于加密会话数据。
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false
}));3. 初始化 Passport
在 Express 应用中初始化 Passport,并配置它使用会话。
app.use(passport.initialize()); app.use(passport.session());
4. 配置本地策略
passport-local 提供了一个本地策略,用于处理用户名和密码的验证。你需要定义一个验证函数,该函数接收用户名和密码,并返回用户对象或错误信息。
// www.javascriptcn.com code example
passport.use(new LocalStrategy(
function(username, password, done) {
// 这里应该是你的用户验证逻辑
if (username === 'user' && password === 'password') {
return done(null, { id: 1, username: 'user' });
} else {
return done(null, false, { message: 'Incorrect username or password.' });
}
}
));5. 序列化和反序列化用户
Passport 需要知道如何将用户对象序列化到会话中,以及如何从会话中反序列化用户对象。
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
// 这里应该是你的用户查找逻辑
done(null, { id: 1, username: 'user' });
});6. 创建登录路由
创建一个路由来处理登录请求。使用 passport.authenticate 方法来处理身份验证,并指定成功和失败时的重定向路径。
app.post('/login',
passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })
);7. 创建主页和登录页面路由
最后,创建主页和登录页面的路由。
app.get('/', (req, res) => {
res.send('Welcome to the home page!');
});
app.get('/login', (req, res) => {
res.send('Please login');
});8. 启动服务器
启动 Express 服务器,监听端口 3000。
app.listen(3000, () => {
console.log('Server is running on port 3000');
});