PassportJS的JWT策略与Node和MySQL不能正常工作。

问题描述 投票:0回答:1

我的应用程序的认证部分有问题。我一直收到这个"类型错误。不能读取对象处未定义的'fromAuthHeaderAsBearerToken'属性。"每当我运行我的server.js文件时,它就会阻止我继续前进。它阻止了我的进一步发展。

以下是我的 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.comrishiprmern-auth。)虽然是用MongoDB。我原本没有使用sequelize,我想这可能是问题所在,所以我重构了它,加入了sequelize,但是并没有解决我的问题。所以我重构了它,加入了sequelize,但这并没有解决我的问题。Googling也没有帮助,因为似乎没有人有这个特定的问题阻止他们运行server.js文件(我看到的大多数人都是在他们进行API调用时出现问题)。

任何帮助都是感激的。谢谢!我在身份验证方面遇到了问题。

node.js express passport.js
1个回答
0
投票

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

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

换成

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

护照-jwt 有一个ExtractJwt类方法,而不是ExtractJWT。记住Javascrit是一种大小写语言。

© www.soinside.com 2019 - 2024. All rights reserved.