【问题标题】:Editing req.user object编辑 req.user 对象
【发布时间】:2019-02-21 12:07:44
【问题描述】:

我正在直接从教程中运行一个基本的护照快速身份验证策略。

(下面显示的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 对象。这将使用户会话拥有用户特定的个人资料数据。

然后我将在身份验证中间件中使用req.user 和添加的profile

//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('/');
    }
}

如何编辑护照用户对象以提供额外的个人资料信息?

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    尝试修改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();
    });
    

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

    【讨论】:

    • 我看到您接受了这个答案,您是否设法为您的具体情况找到解决方法?
    • 是的,我测试了你的答案,这是 facebook 策略的必经之路。它也适用于passport-saml SamlStrategy。截至目前,如果您使用多个 SAML 身份验证点,MultiSamlStrategy 中存在一个报告的错误,该错误不是passReqToCallback。我在下面的答案中发布了解决方法。我仍然不确定您对存储在数据库中的profile 的评论。我不确定来自 IP 的所有数据都应该存储在数据库中,也许像 userId 之类的?
    【解决方案2】:

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2013-01-03
      • 2015-01-18
      • 2021-07-19
      • 2022-01-20
      相关资源
      最近更新 更多