JWT&Passport.js身份验证
#node #passportjs #jsonwebtoken

使用Passport.js和Node.js使用JSON Web令牌(JWT)身份验证,您可以按照以下一般步骤:

  • 安装必要的软件包:
npm install passport passport-jwt jsonwebtoken
  • 创建一个用usernamepasswordemail等字段的用户模型。您可以使用诸如Mongoose之类的库来定义模式并与MongoDB数据库进行交互。

  • 为使用JWT的Passport.js创建一个新策略。此策略将在传入请求的Authorization标头中检查有效的JWT,并将其解码以获取用户的ID。

  • 在路由处理功能中,使用passport.authenticate('jwt', { session: false })来验证用户。

  • 在路由处理功能中,使用req.user访问用户的ID和其他信息。

  • 在登录函数中,使用JSONWEBTOKEN软件包将用户ID作为有效载荷创建JWT。

这是一些示例代码以演示上述步骤:

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const jwt = require('jsonwebtoken');
const mongoose = require('mongoose');

const User = mongoose.model('users', new mongoose.Schema({
  username: String,
  password: String,
  email: String
}));

const jwtOptions = {
  jwtFromRequest: ExtractJwt.fromHeader('authorization'),
  secretOrKey: 'secret'
};

const jwtAuth = new JwtStrategy(jwtOptions, (payload, done) => {
  User.findById(payload.sub)
    .then(user => {
      if (user) {
        done(null, user);
      } else {
        done(null, false);
      }
    })
    .catch(err => {
      done(err, false);
    });
});

passport.use(jwtAuth);

app.post('/login', (req, res, next) => {
  passport.authenticate('local', { session: false }, (err, user, info) => {
    if (err || !user) {
      return res.status(400).json({
        message: 'Something is not right',
        user: user
      });
    }
    req.login(user, { session: false }, (err) => {
      if (err) {
        res.send(err);
      }
      // generate a signed json web token with the contents of user object and return it in the response
      const token = jwt.sign(user.toJSON(), 'secret');
      return res.json({ user, token });
    });
  })(req, res);
});

app.get('/profile', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.send(req.user);
});

请注意,上面的示例只是一个样本,不应在没有其他安全检查的情况下用于生产中。

您也可以检查github repo