Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在node.js中使用Passport访问序列化用户_Node.js_Session_Passport.js - Fatal编程技术网

如何在node.js中使用Passport访问序列化用户

如何在node.js中使用Passport访问序列化用户,node.js,session,passport.js,Node.js,Session,Passport.js,我已经能够通过Passport进行身份验证,但我不知道如何访问序列化用户。我在几个地方读到过,访问它的方法是使用req.user,但当我使用GET to/hello尝试时,它说用户未定义 这是我的app.js var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var authentication = require('./routes/a

我已经能够通过Passport进行身份验证,但我不知道如何访问序列化用户。我在几个地方读到过,访问它的方法是使用req.user,但当我使用GET to/hello尝试时,它说用户未定义

这是我的app.js

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var authentication = require('./routes/authentication');
var content = require('./routes/content');
var posts = require('./routes/post.js');
var upload = require('./routes/upload.js');
var media = require('./routes/media.js');
var http = require('http');
var path = require('path');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var mongoConnectionString = 'mongodb://localhost/judgmental';
var User = require('./models/user.js');

mongoose.connect(mongoConnectionString, function(error) {
    if (error) {
        throw error;
    }
    console.log('Successfully connected to MongoDB');
});

var app = express();

// all environments
app.set('port', process.env.PORT || 3001);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('upload_dir', __dirname + '/uploads/posts/');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser({uploadDir:'./uploads/temp'}));
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser('keyboard cat'));
app.use(express.cookieSession({secret:'keyboard cat', maxAge: 1000}));
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);

// development only
if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}

passport.use(new LocalStrategy(
    function(username, password, done) {
        var query = username.indexOf("@") !== -1 ? {email: username} : {username: username};
        User.findOne(query, function (err, user) {
            if (err) { return done(err); }
            if (!user) { return done(null, false, { message: 'Incorrect username.' }); }
            user.authenticate(password, function(error, user){
                if (error) { return done(error); }
                if (!user) { return done(null, false, { message: 'Incorrect password.' }); }
                return done(null, user);
            });
        });
    }
));

// routes
// Users
app.get('/', routes.index);
app.get('/users', user.list);

app.get('/content', content.show);

// Posts
app.get('/post', posts.single);
app.get('/post/test/:id', posts.test);
app.get('/posts', posts.list);
app.post('/post/submitPost', posts.submitPost);
app.get('/post/upload', posts.uploadDefault)

// Upload
app.post('/upload/upload-file', upload.upload);

// Image handler
app.get('/media/:id', media.getImage);

// Authentication
app.post('/signUp', authentication.signUp);
app.post('/signIn', authentication.signIn);
app.get('/hello', function(req, res) {
    res.render('index.jade', { id: req.user.id });
});

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

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

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

我知道用户是序列化的,因为在我进行身份验证时,控制台会记录“serializeUser”。有人知道如何在my get/hello中获取序列化用户吗?

IIRC如果会话存储中间件应用不当,可能会出现问题。查看passportjs express3示例

您的代码在我看来还行。POST/signIn有效吗?登录后是否在浏览器中看到会话cookie?是的,帖子正在运行,我进行身份验证,然后返回客户端收到的答案。还有一个名为“connect.sess”的cookie已更新,但其内容很奇怪(s%3Aj%3A%7B%22passport%22%3A%7B%22user%22%3A%22527fec0ba5ca2d941f000001%22%7D%7D.T5YD0bo4AtV%2f3a0z5tixoie5xkozcy7fid3in2mupm)…可能需要查看您的身份验证路径,以了解登录功能正在做什么。实际上,玩弄我的代码,我想这可能是Passport或express的一个怪癖/错误。我使用express.session()而不是cookieSession,再加上Redistore来存储会话,效果很好。从实验来看,问题似乎更多地出现在反序列化用户函数中,该函数似乎没有根据cookie查找用户(表明Passport或Express可能正在生成格式不正确的cookie?)。我还使用
Express.session
CookiesSession
之后。反序列化用户函数不会是问题,它从未被调用。。。也许这就是问题所在(我不太知道反序列化函数做什么,什么时候应该调用它)。。。存储会话是否需要RedisStore?链接已断开。。。下一次当你在你的答案中发布一个链接时,请包含实际的文本摘要,这样它就不会在将来失效。