首页 文章

req.user是未定义的Express.js Passport.js

提问于
浏览
0

下面的中间件功能无法访问req.user或检查用户是否在用户登录后登录 .

我知道passport.serializeUser在登录后成功,并且在从中间件功能访问时定义了 req .

我是节点及其软件包的新手,所以我可能会遗漏一些基本的东西 . 任何帮助是极大的赞赏 .

中间件功能:

app.use('/private/*', function(req, res, next) {
    console.log(req.user); // returns undefined
    console.log(req.isAuthenticated()) // returns false
    res.redirect('/')
});

完整代码:

var express = require('express'),
    cookieParser = require('cookie-parser'),
    session = require('express-session'),
    passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    bodyParser = require('body-parser'),
    flash = require('express-flash'),
    http = require('http');

var app = express()

app.use(flash());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(session({
secret: 'akdsgklasdglkadsgladsglk',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
app.use(passport.initialize())
app.use(passport.session())
app.use(cookieParser('sdagahafdhfdshdfshfsd'))

// Store users
var users = {}

// Configure passport validation
function get_pass(username, password, callback) {
var params = {
          "username": username,
          "password": password,
          "app_token": 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
          "app_version": '1.0'
        }

var options = {
    hostname: 'sub_domain.domain.com',
    path: '/path/path/path/authenticate',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    }
};

var plasma_req = http.request(options, function(plasma_res) {
    if (plasma_res.statusCode === 201) {
        // Login passed
        plasma_res.setEncoding('utf8');
        let rawData = '';
        plasma_res.on('data', (chunk) => rawData += chunk);
        plasma_res.on('end', () => {
            try {
                let parsedData = JSON.parse(rawData);
                var user = {'username': parsedData['user']['username'],
                    'fname': parsedData['user']['first_name'],
                    'lname': parsedData['user']['last_name'],
                    'user_id': parsedData['user']['user_id'],
                    'email': parsedData['user']['email']
                };
                // add user to local database
                users["id" + user['user_id']] = user
                callback([true, user])
            } catch (e) {
                console.log(e.message);
            }
        });
    } else {
        // Login failed
        console.log('Failed Status: ' + plasma_res.statusCode);
        callback([false, {}])
    }
});
plasma_req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});
plasma_req.write(JSON.stringify(params));
plasma_req.end();
}

// Define passport strategy
passport.use(new LocalStrategy(
function (username, password, done) {
    status = get_pass(username, password, function(status) {
        if (status[0]) {
            console.log("Success")
            // return true
            return done(null, status[1])
        } else {
            console.log("Failure", status)
            // return false
            return done(null, false, { message: "Incorrect credentials"})
        }
    });
}
));

// Serialise user
passport.serializeUser(function (user, done) {
if (users['id' + user.user_id]) {
    done(null, 'id' + user.user_id);
} else {
    done(new Error("CANT_SERIALIZE_THIS_USER"));
}
});

// Deserialise user
passport.deserializeUser(function (userid, done) {
if (users[userid]) {
    done(null, users[userid]);
} else {
    done(new Error("THAT_USER_DOESNT_EXIST"));
}
});

// Login
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: 'login',
successFlash: {message : 'Welcome!'},
failureFalse: true
}));

app.use('/private/*', function(req, res, next) {
    console.log(req.user); // returns undefined
    console.log(req.isAuthenticated()) // returns false
    res.redirect('/')
});
app.use(express.static(__dirname + '/public'))

// Serve it up
var PORT = process.env.PORT || 3000;
app.listen(PORT, function () {
console.log('Server running @ port ' + PORT )
})

1 回答

  • 0

    解决了这个问题

    var express = require('express'),
    cookieParser = require('cookie-parser'),
    session = require('express-session'),
    passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    bodyParser = require('body-parser'),
    flash = require('express-flash');
    
    var app = express()
    
    app.use(flash());
    app.use(session({
        secret: 'cat_on_keyboard',
        resave: false,
        saveUninitialized: true,
        cookie: { secure: false }
    }));
    
    app.use(cookieParser('cat_on_keyboard'))
    app.use(passport.initialize())
    app.use(passport.session())
    
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());
    
    // Store users
    var users = {
        "id1" : { user_id: 1, username: "admin", password: "admin"}
    };
    
    // Config passport local
    passport.use(new LocalStrategy(
        function (username, password, done) {
            for (userid in users) {
                var user = users[userid];
                if (user.username.toLowerCase() == username.toLowerCase()) {
                    if (user.password == password) {
                        return done(null, user)
                    }
                }
            }
            return done(null, false, { message: "Incorect credentials" });
        }
    ));
    
    // Serialise user
    passport.serializeUser(function (user, done) {
        if (users['id' + user.user_id]) {
            done(null, 'id' + user.user_id);
        } else {
            done(new Error("CANT_SERIALIZE_THIS_USER"));
        }
    });
    
    // Deserialise user
    passport.deserializeUser(function (userid, done) {
        if (users[userid]) {
            done(null, users[userid]);
        } else {
            done(new Error("THAT_USER_DOESNT_EXIST"));
        }
    });
    
    app.get('/', function (req, res) {
        console.log(req.flash());
    
        h_page = '<h1>Title of landing page</h1>' +
        '<a href="/login"><div style="display: inline-block; padding: 5px; margin: 10px; border-radius: 3px; border: 1px solid grey; cursor: pointer; background-color: #F8F8F8;"><span>Log In</span></div></a>' +
        '<a href="/private"><div style="display: inline-block; padding: 5px; margin: 10px; border-radius: 3px; border: 1px solid grey; cursor: pointer; background-color: #F8F8F8;"><span>Private</span></div></a>';
    
        res.send(h_page)
    });
    
    app.get("/login", function (req, res) {
        var error = req.flash("error");
        var form = '<!DOCTYPE html>' +
        '<html>' +
        '    <body>HTML Login form</body>' +
        '</html>';
    
        res.send(form);
    });
    
    // Login
    app.post('/login', passport.authenticate('local', {
        successRedirect: '/private',
        failureRedirect: '/login',
        successFlash: {message : 'Welcome!'},
        failureFlash: true
    }));
    
    app.get('/private', authenticateOrNot, function(req, res) {
        console.log(req.flash('success'));
        res.end('Secrets');
    });
    
    function authenticateOrNot (req, res, next) {
        if (req.isAuthenticated()) {
            next()
        } else {
            console.log("Unathenticated user, redirecting to login");
            res.redirect('/login')
        }
    }
    
    // Serve it up
    var PORT = process.env.PORT || 8080;
    app.listen(PORT, function () {
        console.log('Server running @ port ' + PORT )
    })
    

相关问题