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 req.user 未定义

如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?

passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?

Passport.js、会话和反应 |从 /login 路由以外的任何路由访问 req.user 是未定义的

req.user.displayname 未定义 Nodejs + passport = google oauth