passport.js deserializeUser不修改req.user

时间:2015-09-14 19:01:37

标签: express passport.js

由于req.user,我未发现对req.session.passport.userdeserializeUser()个对象产生任何影响。

我的理解是成功完成deserializeUser()应该导致我的用户对象 I 从数据库中检索应该设置为req.user属性。 这是正确的吗?

此外,这个回调的目的似乎是允许我在cookie本身中序列化一个小对象(例如:{username: 'me', email: 'me@me.com'}),然后添加从数据库中检索的更多用户信息以使用下游。

相反,我看到以下内容:

passport.serializeUser(function(user, done) {
    // user: 'stan@stadelman.com'
    fetchUser(user, function(u) {
        // u: { email: 'stan@stadelman.com', name: 'Stan Stadelman' }
        done(null, u);
    });
});

passport.deserializeUser(function(id, done) {
    // id: { email: 'stan@stadelman.com', name: 'Stan Stadelman' }
    fetchUser(id.email, function(user) {
        // user: { email: 'stan@stadelman.com', name: 'Stan Stadelman',    local_props: 'from_db'}
        done(null, user);
    });
});

req.user = 'stan@stadelman.com'
req.session = { cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: { user: { email: 'stan@stadelman.com', name: 'Stan Stadelman'    } } }

我的期望是req.session.passport.user和/或req.user对象应包含local_props属性值。我在阅读文档&教程不正确,还是有问题?我已经在passport.js github here中交叉发布。

我的快递&护照设置如下:

// express configs
app.use(cookieParser(expressSecret));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(expressSession({ 
    secret: expressSecret, 
    resave: true, 
    saveUninitialized: true }
));
app.use(passport.initialize());
app.use(passport.session());

// passport implementation
passport.use(new BasicStrategy(/...));

2 个答案:

答案 0 :(得分:1)

您应该将用户ID传递给序列化中的完成回调

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

然后使用该ID在反序列化中获取用户

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

答案 1 :(得分:0)

我遇到了类似的问题,但是是由其他原因引起的。 Passport.js computed: { series() { return this.test; } } 的工作是将用户对象设置为deserializeUser()

req.user

但是,为了检查用户是否登录,我在服务器/ account / me上有一条路由,该路由采用passport.deserializeUser(async function(id, done) { try { const account = await Account.findById(id); done(null, account); } catch (error) { done(error, null) } }); 并将其返回为json:

req.user

要过滤敏感属性,我有一个在Mongoose模式中定义的toJSON()方法:

router.route('/account/me').get(mwAuthentication, (req, res) => {
  res.json(req.user);
});

当您调用AccountSchema.methods.toJSON = function() { let account = this; let accountObject = account.toObject(); return _.pick(accountObject, ['_id', 'fullName', 'email', 'facebookId', 'photoUrl']); }; 时,它会在内部调用res.json(req.user),这再次调用了我的JSON.stringify(req.user)方法并将对象限制为我选择的属性。

希望这对某人有帮助。