node.js - req.user 使用 Passport.js 1-2 分钟后清除

标签 node.js reactjs passport.js axios express-session

我的应用程序遇到了 req.user 持续存在的问题。成功登录/序列化用户等后,我可以在保存的内容中看到 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 的存储中,并且我可以看到 session 仍然存在于那里。

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' } } }
------------

最佳答案

cookie: { maxAge: 60000 }

即 60.000 毫秒,即 60 秒。正是您所描述的 1 分钟。

关于node.js - req.user 使用 Passport.js 1-2 分钟后清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52241696/

相关文章:

javascript - 无法在nodejs中的另一个文件中导出模块

javascript - React-Native android,重置默认应用程序

node.js - 如何传递基于 Node js Passport 模块的身份验证回调函数的 HTTP 响应对象部分?

session - 为什么 Passport-twitter 需要 session 支持

javascript - Strongloop Passport.js 身份验证 - "Failed to obtain access token"

node.js - Loopback discoverAndBuildModels 不生成模型

node.js - Angular 8项目不可用

javascript - 意外的标记 。在 val.toString() 中

reactjs - 使用 React JSX,在花括号中放置静态值属性会产生任何开销吗?

javascript - 如何在样式组件中获取元素的宽度(以 px 为单位)?