req.user 使用 passport.js 1-2 分钟后清除
Posted
技术标签:
【中文标题】req.user 使用 passport.js 1-2 分钟后清除【英文标题】:req.user clears after 1-2 minutes using passport.js 【发布时间】:2019-02-13 22:30:57 【问题描述】:我的应用程序存在 req.user 持续存在的问题。成功登录/serializeUser 等后,我可以看到已保存的 req.user,应用程序按需要运行约 1-2 分钟。之后,req.user 清除为未定义。我正在使用当前使用 react 并调用服务器的方法来确认 componentDidMount 上有一个 req.user。我不知道为什么,我对此很陌生。
在我的 server.js 中:
app.use(bodyParser.json())
// Sessions
app.use(
express-session(
secret: 'feedmeseymour',
cookie: maxAge: 60000 ,
store: new MongoStore( mongooseConnection: dbConnection ),
resave: false,
saveUninitialized: false
)
)
// MIDDLEWARE
app.use(morgan('dev'))
app.use(
bodyParser.urlencoded(
extended: false
)
)
app.use(bodyParser.json())
app.use(express.static('public'));
app.use(cors());
app.use(bodyParser.urlencoded(extended: true));
app.use(bodyParser.json());
// Passport
app.use(passport.initialize())
app.use(passport.session())
我的登录路径:
router.post(
'/',
function (req, res, next)
console.log('Received login information. Username: ' + req.body.username)
const errors, isValid = validateLoginInput(req.body);
if (!isValid)
return res.status(400).json(errors);
next()
,
passport.authenticate('local', failWithError: true ),
function (req, res, next)
console.log('req.user in the backend: ' + req.user);
var userInfo = req.user
res.send(userInfo);
,
function (err, req, res, next)
res.status(401).send( success: false, message: err )
)
passport.serializeUser/反序列化方法:
passport.serializeUser((user, done) =>
console.log('*** serializeUser called, user: ')
console.log(user) // the whole raw user object!
console.log('---------')
done(null, _id: user._id )
)
// user object attaches to the request as req.user
passport.deserializeUser((id, done) =>
console.log('DeserializeUser called')
User.findOne(
_id: id ,
'username',
(err, user) =>
console.log('*** Deserialize user, user:')
console.log(user)
console.log('--------------')
done(null, user)
)
)
在 componentDidMount 上调用:
getUser()
axios.get('/users').then(response =>
if (response.data.user)
this.setUser(true, response.data.username, response.data.super);
else
console.log('no user is logged in')
this.setUser(false, null, false);
)
在后面调用这条路线:
router.get('/', (req, res, next) =>
console.log('req.user:');
console.log(req.user);
console.log('------------');
console.log('req.session:');
console.log(req.session);
console.log('------------');
if (req.user)
User.findOne( _id: req.user._id , (err, user) =>
if (err)
console.log('logged user retrieval error: ', err)
else if (user)
console.log('found user from _id: ' + user);
res.json( user: req.user, super: user.super )
)
else
res.json( user: null )
)
req.user 在后面存在大约 1-2 分钟,然后进入 undefined。我将用户存储在 mongodb 的商店中,我可以看到会话仍然存在。
req.user 与信息一起保存。一分钟后,这将变为未定义:
req.user:
_id: 5b7ded93525742053a6dd155, username: 'admin'
------------
req.session:
Session
cookie:
path: '/',
_expires: 2018-09-09T07:10:22.902Z,
originalMaxAge: 60000,
httpOnly: true ,
passport: user: _id: '5b7ded93525742053a6dd155'
------------
【问题讨论】:
【参考方案1】:cookie: maxAge: 60000
即 60.000 毫秒,即 60 秒。正是你所描述的 1 分钟。
【讨论】:
就是这样。谢谢!【参考方案2】:尝试将user
存储在请求的session
对象中。这种方式对我有用。
【讨论】:
以上是关于req.user 使用 passport.js 1-2 分钟后清除的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Passport.js 和 Express 4 访问 req.user
如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?
passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?