Bootstrap

第10章 Express进行认证和授权(二)

3. 使用 Passport.js 实现认证

Passport.js是一个灵活的Node.js认证中间件,支持多种认证策略(如本地认证、OAuth等)。

安装与配置

首先,安装Passport.js及其本地认证策略:

npm install passport passport-local

然后,配置Passport.js:

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

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
}, async (email, password, done) => {
    try {
        const user = await User.findOne({ email });
        if (!user || !await bcrypt.compare(password, user.password)) {
            return done(null, false, { message: 'Invalid email or password' });
        }
        return done(null, user);
    } catch (error) {
        return done(error);
    }
}));

passport.serializeUser((user, done) => {
    done(null, user._id);
});

passport.deserializeUser(async (id, done) => {
    try {
        const user = await User.findById(id);
        done(null, user);
    } catch (error) {
        done(error);
    }
});

app.use(passport.initialize());
app.use(passport.session());
用户注册与登录路由

在用户注册路由中,注册成功后直接登录用户:

app.post('/register', async (req, res, next) => {
    try {
        const { name, email, password } = req.body;
        const user = new User({ name, email, password });
        await user.save();
        req.login(user, (err) => {
            if (err) { return next(err); }
            res.status(201).send({ message: 'User registered and logged in' });
        });
    } catch (error) {
        res.status(400).send({ error: 'User registration failed', details: error.message });
    }
});

在用户登录路由中,使用Passport.js进行认证:

app.post('/login', passport.authenticate('local'), (req, res) => {
    res.send({ message: 'Login successful' });
});
保护路由

使用Passport.js的ensureAuthenticated中间件来保护路由:

const ensureAuthenticated = (req, res, next) => {
    if (req.isAuthenticated()) {
        return next();
    }
    res.status(401).send({ error: 'Access denied' });
};

app.get('/protected', ensureAuthenticated, (req, res) => {
    res.send({ message: 'This is a protected route', user: req.user });
});

在本章中,我们介绍了如何在Express应用中实现用户认证与授权,包括用户注册与登录、使用JWT进行身份验证以及使用Passport.js实现认证。通过学习这些内容,你应该能够:

  1. 实现用户注册与登录功能。
  2. 使用JWT进行无状态的用户身份验证。
  3. 使用Passport.js集成多种认证策略。
;