javascript - Passport.js 的 req.isAuthenticated() 总是返回 false
问题描述
那是我的代码:server.js:
require('dotenv').config()
var fs = require('fs')
var express = require('express')
var app = express()
var helmet = require('helmet')
var router = require('./router')
var session = require('express-session')
var passport = require('passport')
var cookie = require('cookie-parser')
var redis = require('redis').createClient(process.env.REDIS_PORT)
var redisStore = require('connect-redis')(session)
app.use(helmet())
app.use(cookie())
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(passport.initialize())
app.use(passport.session())
app.use(session({
store: new redisStore({client: redis}),
secret: 'rior124jybtyokipoev5432rtoe34wpta',
cookie: {
path: '/',
httpOnly: true,
maxAge: 1000*60*60*24*365,
secure: false
},
resave: false,
saveUninitialized: false
}))
app.use(router)
require('./config/passport');
app.listen(process.env._PORT, () => {
console.log('[Info][Backend] Backend http serve succesfuly started! Port: '+process.env._PORT);
})
路由器/index.js:
var router = require('express').Router()
var auth = require('../lib/auth_mw')
var fs = require('fs')
router.use(require('./logging'))
router.use(require('./news'))
router.get('/', (req, res) => {
res.contentType('text/plain')
res.end(fs.readFileSync(__dirname+'/../siteinfo.txt'))
})
router.get('/private', auth, (req, res) => {
res.end('private')
})
module.exports = router
配置/passport.js:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
var users = require('../models').users
passport.serializeUser(function(user, done) {
console.log('serialize: ', user);
done(null, user.email);
});
passport.deserializeUser(function(email, done) {
console.log('deserialize: ', email);
users.findOne({
attributes: [
'email'
],
where: {
email
}
}).then(user => {
done(null, user.email === email ? user.dataValues : false);
})
});
passport.use('local',
new LocalStrategy({ usernameField: 'email' }, async function(
email,
password,
done
) {
let user = await users.findOne({
attributes: [
'email',
'password'
],
where: {
email,
password
}
})
if (user.dataValues.email) {
return done(null, user.dataValues);
} else {
return done(null, false);
}
})
);
登录总是成功的,但是当我试图去 /private 时,没有调用反序列化函数!我在网上找到了很多解决方案,但没有帮助。请提出尽可能多的解决方案
PS我使用sequelize作为数据库驱动程序(idk也许很重要)
解决方案
此查询将返回正确的用户,因此您无需再次检查输出。
users.findOne({
attributes: [
'email'
],
where: {
email
}
})
尝试done(null, user.dataValues);
代替done(null, user.email === email ? user.dataValues : false);
推荐阅读
- c# - 是否可以有两个连接字符串并为每个用户在它们之间切换?
- flutter - Flutter:Dio HTTP处理错误异常404
- python - 如何在现有窗口应用程序发出信号后显示另一个小部件?(两个 gui 都使用 pyuic5 从 ui 转换)
- azure-logic-apps - 逻辑应用文件系统连接器能否在没有网关的情况下访问 ISE 环境中的文件共享?
- python-3.x - 无法使用 python 连接到 Teradata 16
- image-processing - 图像处理:对连续值进行约束的优化
- firebase - 使用 storage().bucket().file(fileName).save(file) 包含自定义元数据
- postgresql - 将 PostgreSQL 间隔转换为秒会产生错误的值
- java - DialogFragment:显示第一个对话框,在正面按钮上,显示第二个对话框,在第二个对话框上再次显示第一个对话框
- android - 通过公司 smtp 服务器使用 android 应用程序发送电子邮件