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 是区分大小写的语言。
我的应用程序的身份验证部分有问题。每当我 运行 我的 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 是区分大小写的语言。