【问题标题】:req.user is undefined Express.js Passport.jsreq.user 未定义 Express.js Passport.js
【发布时间】:2017-03-14 01:53:46
【问题描述】:

下面的中间件函数不能访问req.user或者用户登录后检查用户是否登录。

我知道 passport.serializeUser 在登录后成功,并且req 是在从中间件函数访问它时定义的。

我是 node 及其包的新手,所以我可能缺少一些基本的东西。非常感谢任何帮助。

中间件功能:

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

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    解决了问题

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

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 2015-07-18
      • 1970-01-01
      • 2018-02-23
      • 2014-09-18
      • 2021-12-27
      • 2016-04-01
      • 2017-06-13
      • 2015-02-02
      相关资源
      最近更新 更多