.isAuthenticated()始终为false ||护照本地化策略

时间:2020-08-03 01:49:38

标签: javascript node.js mongodb express passport.js

与此职位有很多类似的职位,但是在那些对我有帮助的职位的答案中,我都没有找到合格的解决方案。

代码

"use strict";

require('dotenv').config();

const auth     = require('./auth.js');

const express       = require('express');
const passport      = require('passport');
const bcrypt        = require('bcrypt');
const mongo         = require('mongodb');
const session       = require('express-session');
const cors          = require('cors');
const util          = require('util');

const app  = express();
const port = process.env.PORT || 8080;

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({extended:true}));

app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true,
  cookie: {
    secure: false,
    maxAge: 1000 * 60 * 60 * 24 * 7
  }
}));

app.use(passport.initialize());
app.use(passport.session());

mongo.connect(process.env.DATABASE, {useNewUrlParser: true, useUnifiedTopology: true}, (err, db) => {
  if (err) {
    console.log('Database error: ' + err);
  } else {
    console.log('Database connection successful');

    auth(app, db);

    app.route('/test').get((req, res) => {
      res.send('The connection works!')
    });

    const ensureAuthenticated = (req, res, next) => {
      console.log('isAuth() is: ' + req.isAuthenticated());
      console.log('session store: ' + util.inspect(req.session, {showHidden: false, depth: null}));
      if (req.isAuthenticated()) return next();
      res.send('user not authenticated, begone! >:(');
    }

    app.route('/profile').get(
      ensureAuthenticated,
      (req, res) => {
        res.render({username: req.user.username});
      }
    );

    app.post('/login', 
      (request, response, next) => {
        console.log(request.session)
        passport.authenticate('local', 
        (err, user, info) => {
          if(!user){ response.send(info.message);}
          else{
            request.login(user, function(error) {
              if (error) return next(error);
              console.log("Request Login supossedly successful.");
              return response.send('Login successful');
            });
            //response.send('Login successful');
          }

        })(request, response, next);
      }
    );

    app.route('/register').post((req, res, next) => {
      const hash = bcrypt.hashSync(req.body.password, 13);
      db.db().collection('users').findOne({username: req.body.username}, (err, user) => {
        if (err) {
          next(err);
        } else if (user) {
          res.send('user already exists :(');
        } else {
          db.db().collection('users').insertOne({
            username: req.body.username,
            password: hash
          },
            (err, doc) => {
              if (err) {
                res.send('registration mongo error');
              } else {
                next(null, user);
              }
            }
          )
        }
      })
    },
      passport.authenticate('local', {failureMessage: 'passport authenticate failure'}),
      (req, res, next) => {
        console.log('registration successful');
        req.logIn(req.user, err => {
          if (err) next(err)
          return console.log("i'm trying: " + req.user);
        });
        res.send('registration successful!!! :D');
      }
    );

    app.listen(port, () => {console.log(`Listening on port: ${port}`)});
  }
});

auth.js

const passport      = require('passport');
const LocalStrategy = require('passport-local');
const ObjectID      = require('mongodb').ObjectID;
const bcrypt        = require('bcrypt');

module.exports = (app, db) => {
  passport.use(new LocalStrategy(
    (username, password, done) => {
      db.db().collection('users').findOne({username: username}, (err, user) => {
        console.log(`${username} attempted to log in`);
        if (err) return done(err);
        if (!user) return done(null, false);
        if (!bcrypt.compareSync(password, user.password)) return done(null, false);
        console.log('local strategy successful');
        return done(null, user);
      })
    }
  ));

  passport.serializeUser((user, done) => {
    console.log(user.username + " serialized");
    done(null, user._id);
  });

  passport.deserializeUser((id, done) => {
    db.db().collection('users').findOne(
      {_id: new ObjectID(id)},
      (err, doc) => {
        done(null, doc);
      }
    );
  });
}

问题:

所有功能都工作正常,我获得了所有成功返回消息,甚至通过注册将用户保存到数据库,并通过登录成功从数据库中加载该用户。我唯一遇到的问题是函数req.isAuthenticated()中的ensureAuthenticated总是返回false,正如您所看到的,我真的非常需要它为true,以便将信息发送给/ profile路由的客户端,并使用Passport完成我需要的所有其他操作。我想念什么?

1 个答案:

答案 0 :(得分:0)

解决方案::我需要将credentials: true添加到cors()中,并在客户端中添加类似于http标头(对于axios为withCredentials:true)。我添加这个是因为我知道某天某人会遇到同样的问题,并且可能和我一样很难找到这个答案。

其他:在我问过这个问题的大多数论坛中,我得到的答案都是所有人都不相信此代码有效,并通过告诉我我需要重新学习护照和做出反应(如果我真的得到了答案)。

相关问题