正在编辑 req.user 个对象

Editing req.user object

我是运行直接出教程的express for passport的基本认证策略。

(Facebook策略如下所示,因为它很常见,我实际上使用的是passport-saml,但这个问题涉及所有护照策略):

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, cb) {
      //HOW DO I ATTACH THE profile OBJECT HERE TO THE PASSPORT USER?
      //OR IS THERE ANOTHER WAY TO SAVE profile FOR LATER? (without using a database)
      return cb(null, profile);
  }
));

我需要编辑 req.user 对象,并附加来自护照回调的 profile 对象。这将使用户会话具有用户特定的配置文件数据。

然后我将在身份验证中间件中使用添加了 profilereq.user

//MIDDLEWARE TO CHECK IF USER IS LOGGED IN
function authUser(req, res, next) {
    if (req.user) {
        //I WANT TO HAVE THE profile AVAILABLE HERE
        next();
    } else {
        res.redirect('/');
    }
}

如何编辑通行证用户对象以获得额外的个人资料信息?

尝试修改 req.user 似乎不是最好的做法(如果它能奏效的话)。我相信 req.user 应该始终与您数据库中的用户相同。

但是,您可以使用 passReqToCallback 在 Passport 回调中使用 req,并相应地设置 req.session

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "/auth/facebook/callback",
    passReqToCallback: true
  },
  function(req, accessToken, refreshToken, profile, cb) {  
      req.session.profile = profile;
      return cb(null, profile);
  }
));

然后您应该记得在任何未定义 req.user 的请求中删除 req.session.profile,以免保留已注销用户的过时 profile 信息。

app.get("*", function(req, res, next){
    if(req.session.profile && !req.user)
        delete req.session.profile;
    next();
});

所有这些都未经测试,但我相信它对你有用。

passport-saml 可能适用于其他策略的答案:

profile 会自动保存到用户对象。

诀窍在于,如果用户属性为空,则不会保存。即:

{nameId:'russHanneman', sessionId: undefined}

sessionId 不会进入用户对象。如果您需要调整用户 cookie 使其与返回的 profile 不同,您可以在序列化时这样做:

passport.serializeUser(function(user, done) {
   done(null, {
      id: "custom value",
      nameId: user["userName"],
      email: user["email"]
   });
});

在护照中配置和序列化: http://www.passportjs.org/docs/configure/