PassportJS JWT Strategy with Node 和 MySQL 不工作

PassportJS JWT Strategy with Node and MySQL not working

我的应用程序的身份验证部分有问题。每当我 运行 我的 server.js 文件时,我总是收到这个“TypeError:无法读取未定义的 属性 'fromAuthHeaderAsBearerToken' 对象。”。它阻止了我进一步的进步。

这是我的 passport.js 文件

const JWTStrategy = require('passport-jwt').Strategy;
const ExtractJWT = require('passport-jwt').ExtractJWT;
const User = require('../dbConnection/database.js');
const keys = require('./keys.js');

const opts = {
  jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
  secretOrKey: keys.secretOrKey,
};

module.exports = passport => {
  passport.use(
    new JWTStrategy(opts, (jwt_payload, done) => {
      User.findOne( {id: jwt_payload.id} ).then(user => {
        if (user) {
          return done(null, user);
        }
        return done(null, false);
      })
      .catch(err => console.log(err));
    })
  );
};

用户架构

const mysql = require('mysql2');
const Sequelize = require('sequelize');

// Initiate mysql connection

const connOptions = {
    host: 'localhost',
    user: 'root',
    password: 'dummypassword',
    database: 'countdown',
    dialect: 'mysql'
};

const sequelize = new Sequelize(connOptions);

// Connect sequelize to the database
sequelize.authenticate()
  .then(console.log('Connection has been successfully established'))
  .catch(err => console.error('Unable to connect to the database: ', err));


// Create user model
const User = sequelize.define('user', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
    allowNull: false
  },
  firstName: {
    field: 'first_name',
    type: Sequelize.STRING,
    allowNull: false
  },
  lastName: {
    field: 'last_name',
    type: Sequelize.STRING,
    allowNull: false
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false
  },
  password: {
    type: Sequelize.STRING,
    allowNull: false
  }
}, {
  tableName: 'users'
});

module.exports = User;

还有我的 server.js 文件

const express = require('express');
const _ = require('lodash');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const users = require('./routes/api/users.js');

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/client/public'));
app.use(cors());

// Passport Middleware
app.use(passport.initialize());

// Passport config
require('./config/passport')(passport);

// Routes
app.use('/users', users);

const port = process.env.port || 5000;
app.listen(port, () => {
  console.log('Server started on port ' + port);
});

我真的很迷茫,因为我确实是按照一个教程一步一步地完成这个过程 (https://github.com/rishipr/mern-auth),尽管它是 MongoDB。我最初没有使用 sequelize 并认为这可能是问题所在。所以我重构了它以合并 sequelize 但它没有解决我的问题。谷歌搜索也没有帮助,因为似乎没有人遇到这个特定问题阻止他们 运行 宁 server.js 文件(我看到的大多数人在拨打 API 电话时遇到问题) .

感谢任何帮助。谢谢!

问题出在 passport.js 文件中的第 2 行

const ExtractJWT = require('passport-jwt').ExtractJWT;

替换为

consst ExtractJWT= require('passport-jwt').ExtractJwt;

passport-jwt 有一个 ExtractJwt class/method 而不是 ExtractJWT。请记住 Javascrit 是区分大小写的语言。