Passportjs req.isAuthenticated始终显示为假

时间:2018-10-25 11:49:27

标签: node.js angular express passport.js

我正在使用nodejs / Angular护照中间件登录身份验证,但是工作正常,但是当我尝试通过req.authentication调用不要求输入登录名时,password.deserializeUser函数始终显示req.authentication错误帮助如何解决此问题。有任何想法吗。 在这里我粘贴了我尝试过的代码

Server.js

const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
// const logger = require('morgan');
var cookieParser = require('cookie-parser');
const chalk = require('chalk');
const errorHandler = require('errorhandler');
const dotenv = require('dotenv');
const path = require('path');
const mongoose = require('mongoose');
const MongoStore = require('connect-mongo')(session);
const passport = require('passport');
const expressValidator = require('express-validator');
const http = require('http');
const app = express();
// cros origin handling method start
const cors = require('cors');

dotenv.load({ path: '.env.Config' });
app.use(bodyParser.json());

app.use(express.static(__dirname + "/public"));
app.set('views', __dirname + '\\public');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
//mongodb config
mongoose.connect(process.env.MONGODB_URI);
mongoose.connection.on('error', () => {
    console.log('%s MongoDB connection error. Please make sure MongoDB is running.', chalk.red('✗'));
    process.exit();
});
app.use(cookieParser(process.env.SESSION_SECRET));
app.enable('trust proxy'); // add this line
//express session config
app.use(session({
    name: 'UpgradeApp.sid',
    resave: true,
    //    saveUninitialized: true,
    secret: process.env.SESSION_SECRET,
    store: new MongoStore({
        url: process.env.MONGODB_URI,
        autoReconnect: true
    }),
    proxy: true, // add this line
    saveUninitialized: false,
    cookie: {//New
        maxAge: 36000000,
        httpOnly: false,
        secure: false
    }

}));

require('./src/SchemaConfig/PassportConfig');
//cors origin config
app.use(cors({
    origin: ['http://localhost:4200', 'http://127.0.0.1:4200', 'http://192.168.1.93:4200'],
    credentials: true
}));
//bodyparser config
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb", extended: true, parameterLimit: 200000 }));
app.use(passport.initialize());
app.use(passport.session());


//schema config

const UserConfig = require('./src/SchemaConfig/UserSchema');


function isAuthenticated(req, res, next) {
    var ss = req.isAuthenticated();//always show false
    if (req.isAuthenticated()) next();
    else return res.json('Un-Authenticated');

};
app.get('/logout', isAuthenticated, function (req, res) {
    req.logout();
    res.json("logout");
});
app.get('/GetUser', isAuthenticated, function (req, res, next) {
    return res.json(req.user.UserName);
});

app.post('/login', UserConfig.loginVerify);




app.set('port', process.env.App_PORT || 3000);
app.listen(app.get('port'), () => {
    console.log('%s server running on port', chalk.green('✓'), app.get('port'));
    console.log('  Press CTRL-C to stop\n');
});

PassportConfig

const User = require('../SchemaConfig/UserSchema');
var passport = require('passport')
    , LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt-nodejs');

passport.use('local', new LocalStrategy({
    usernameField: 'Email',
    passwordField: 'Password'
},
    function (Email, Password, done) {
        debugger
        User.findOne({ Email: Email }, function (err, user) {
            debugger
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, {

                    ErrorMsg: 'Incorrect Email.'

                });
            }
            if (user) {
                GlobalUserPwd = user.Password;
            }
            if (!ComparePassword(Password)) {
                return done(null, false, {

                    ErrorMsg: 'Incorrect password.'

                });
            }
            return done(null, user);
        });
    }
));


passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});


function ComparePassword(CandidatePassword) {

    return bcrypt.compareSync(CandidatePassword, GlobalUserPwd)
};

用户模式

 exports.loginVerify = (req, res, next) => {
        passport.authenticate('local', function (err, user, info) {
            debugger
            if (err) { return next(err); }
            if (!user) { return res.status(501).json(info); }
            req.logIn(user, function (err) {
                if (err) { return next(err); }
                 return res.status(200).json({message:'Login Success'});

            });
        })(req, res, next);
    };

1 个答案:

答案 0 :(得分:1)

最后,我找到了解决问题的解决方案,该问题通过 withCredentials:true

传递登录标头请求
const httpOptions = {
  observe:'body',
  withCredentials:true,
  headers:new HttpHeaders().append('Content-Type','application/json')
};