Passport 在每次请求时都会抛出 500 内部服务器错误
Passport throws a 500 internal server error at every request
我对此完全不知所措。我只能假设它是护照,因为当我注释掉它的初始化时,一切都神奇地再次起作用。我目前设置了 2 条路线。一个是要求用户登录的获取请求,另一个是实际执行登录的 post 请求。
在我的 app.js 文件中,我的护照设置如下所示:
var sessionStore = new MySQLStore(options);
//handles cookie/session creation
app.set('trust proxy', 1) // trust first proxy
app.use(session({
secret: config.sessionKey,
resave: false,
store:sessionStore,
saveUninitialized: false,
cookie: {
//secure: true,
maxAge:24*60*60*1000 //1 day in milliseconds
}
}));
app.use(passport.initialize());
app.use(passport.session());
require('./services/passport');
//initiate route handlers
app.use('/login', require('./routes/authRoutes'));
app.use('/tiles', require('./routes/tileRoutes'));
我正在使用本地策略,因为我的用户不会使用任何类型的社交应用程序登录。我配置了另一个文件 passport.js 来实际处理护照设置。我正在使用 sequelize 数据库来验证用户。整个过程如下所示:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
passport.serializeUser((user, done)=>{
done(null, user.id);
});
passport.deserializeUser((user, done)=>{
done(null, user.id);
});
passport.use(new LocalStrategy(function (username, password, done) {
const db = require('../models');
db.user.findOne({ where: {username: username} })
.then((user)=>{
if(!user){
return done(null, false);
}else{
// if(user.dataValues.hashed_password === password)
// return done(null, user);
bcrypt.compare(password, user.dataValues.hashed_password, function(err, res) {
if(res === true){
return done(null, user);
}else{
return done(null, err);
}
});
}
});
}));
注册人员、创建会话和存储会话 ID 似乎都在发生,但是当我开始使用 axios 在我的前端发出 get/post 请求时(我正在使用反应)我不断收到内部服务器错误。我已经尝试用我能想到的任何方式捕捉到它,在确定的点中断,console.logging out 但我只得到相同的消息:
[0] GET /tiles 500 8.049 ms - 2
[0] GET /tiles 500 2.757 ms - 2
或从控制台
GET http://localhost:3000/tiles/ 500 (Internal Server Error)
实际的获取请求看起来像这样(在我知道它有效之前我还没有投入太多):
const express = require('express');
const router = express.Router();
router.get('/', isLoggedIn, (req, res)=>{
debugger;
res.send({hi:'there'})
});
function isLoggedIn(req, res, next) {
debugger;
if (req.isAuthenticated()) return next();
console.log('failure');
res.redirect('/login')
}
module.exports=router;
deserializeUser
这里应该调用id查找用户的函数,然后传给done,第一个参数是userId
as serializeUser
return user.id
到会话存储。示例:
passport.deserializeUser((id, done)=>{
passport.deserializeUser((id, done) => {
User.findById(id).then((user) => {
done(null, user);
}).catch(done);
});
});
我对此完全不知所措。我只能假设它是护照,因为当我注释掉它的初始化时,一切都神奇地再次起作用。我目前设置了 2 条路线。一个是要求用户登录的获取请求,另一个是实际执行登录的 post 请求。
在我的 app.js 文件中,我的护照设置如下所示:
var sessionStore = new MySQLStore(options);
//handles cookie/session creation
app.set('trust proxy', 1) // trust first proxy
app.use(session({
secret: config.sessionKey,
resave: false,
store:sessionStore,
saveUninitialized: false,
cookie: {
//secure: true,
maxAge:24*60*60*1000 //1 day in milliseconds
}
}));
app.use(passport.initialize());
app.use(passport.session());
require('./services/passport');
//initiate route handlers
app.use('/login', require('./routes/authRoutes'));
app.use('/tiles', require('./routes/tileRoutes'));
我正在使用本地策略,因为我的用户不会使用任何类型的社交应用程序登录。我配置了另一个文件 passport.js 来实际处理护照设置。我正在使用 sequelize 数据库来验证用户。整个过程如下所示:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
passport.serializeUser((user, done)=>{
done(null, user.id);
});
passport.deserializeUser((user, done)=>{
done(null, user.id);
});
passport.use(new LocalStrategy(function (username, password, done) {
const db = require('../models');
db.user.findOne({ where: {username: username} })
.then((user)=>{
if(!user){
return done(null, false);
}else{
// if(user.dataValues.hashed_password === password)
// return done(null, user);
bcrypt.compare(password, user.dataValues.hashed_password, function(err, res) {
if(res === true){
return done(null, user);
}else{
return done(null, err);
}
});
}
});
}));
注册人员、创建会话和存储会话 ID 似乎都在发生,但是当我开始使用 axios 在我的前端发出 get/post 请求时(我正在使用反应)我不断收到内部服务器错误。我已经尝试用我能想到的任何方式捕捉到它,在确定的点中断,console.logging out 但我只得到相同的消息:
[0] GET /tiles 500 8.049 ms - 2
[0] GET /tiles 500 2.757 ms - 2
或从控制台
GET http://localhost:3000/tiles/ 500 (Internal Server Error)
实际的获取请求看起来像这样(在我知道它有效之前我还没有投入太多):
const express = require('express');
const router = express.Router();
router.get('/', isLoggedIn, (req, res)=>{
debugger;
res.send({hi:'there'})
});
function isLoggedIn(req, res, next) {
debugger;
if (req.isAuthenticated()) return next();
console.log('failure');
res.redirect('/login')
}
module.exports=router;
deserializeUser
这里应该调用id查找用户的函数,然后传给done,第一个参数是userId
as serializeUser
return user.id
到会话存储。示例:
passport.deserializeUser((id, done)=>{
passport.deserializeUser((id, done) => {
User.findById(id).then((user) => {
done(null, user);
}).catch(done);
});
});