Редактирование объекта req.user - PullRequest
0 голосов
/ 21 февраля 2019

Я использую базовую стратегию аутентификации в экспрессе для паспорта прямо из учебников.

(стратегия 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('/');
    }
}

Как я могуотредактировать объект пользователя паспорта, чтобы иметь доступную дополнительную информацию профиля?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

passport-saml ответ, который, вероятно, работает для других стратегий:

profile автоматически сохраняется в объекте пользователя.

Хитрость в том, что если атрибут пользователя пуст, онне сохраненIE:

{nameId:'russHanneman', sessionId: undefined}

Идентификатор сессии не попадет в объект пользователя.Если вам нужно настроить cookie пользователя так, чтобы он отличался от возвращенного profile, вы можете сделать это при сериализации:

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

Настройка и сериализация в паспорте: http://www.passportjs.org/docs/configure/

0 голосов
/ 21 февраля 2019

Попытка изменить req.user не кажется наилучшей практикой (если это вообще сработает).Я считаю, что req.user всегда должен быть идентичным пользователю в вашей базе данных.

Однако вы можете использовать passReqToCallback, чтобы использовать req в обратном вызове Passport, и установить 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.session.profile в любом запросе, где req.user не определен, чтобы не сохранять устаревшую profile информацию о вышедших из системы пользователях.

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

Все это не проверено, но я считаю, что это может сработать для вас.

...