wake-up-neo.com

PassportJS: Wie bekomme ich in meinen Ansichten req.user

Ich benutze pssportjs mit Express 2.x und einem Sitzungsspeicher. Nach einem Login bekomme ich nur einmal req.User. Sobald ich wieder umleitunganforder.User ist undefiniert.

Hier ist meine Konfiguration:

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

passport.deserializeUser(function(userId, done) {
  User.findOne({_id: userId} ,function(err, user){
    done(err, user);
  });
});

// Authentication Strategy
passport.use(new FacebookStrategy({
    clientID: CONFIG.fb.appId,
    clientSecret: CONFIG.fb.appSecret,
    callbackURL: CONFIG.fb.callbackURL
  },
  function(accessToken, refreshToken, profile, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {

      User.findOne({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) {

          if(olduser) {
            done(null, olduser);
          } else {
            var newuser       = new User();
            var account       = {provider: "facebook", uid: profile.id};
            newuser.accounts.Push(account);
            newuser.firstname = profile.name.givenName;
            newuser.lastname  = profile.name.familyName;
            newuser.email     = "TBD...";

            newuser.save(function(err) {
              if(err) { throw err; }
              done(null, newuser);
            });
          }
        });
    });
  }
));

var app = module.exports = express.createServer();

// configure express
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.compiler({ src : __dirname + '/public', enable: ['less']}));
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());

  //app.use(express.session({ secret: "keyboard cat" }));
  app.use(express.session({
    secret: "victory cat",
    store: new MongoStore({
      url: CONFIG.dbMongo.url
      })
  }));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

Das sind meine Routen:

app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_status', 'user_photos'] }));

app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/index', failureRedirect: '/' }));

app.get('/index', function(req, res) {

            res.render('index.ejs', {
                siteTitle: "Welcome",
                siteUrl: CONFIG.server.siteUrl,
                user: req.user
            });
});

Und zum Schluss versuche ich aus meiner Sicht, auf das Benutzerobjekt zuzugreifen:

<div class="page-header">
    <h3><%= siteTitle %></h3>
</div>  

<% if (!user) { %>
     <p>Not logged in !</p>
<% } else { %>
     <p>Hello, <%= user.firstname %> <%= user.lastname %>.</p>
<% } %>

Nach der Authentifizierung bei Facebook werden in meiner Ansicht Vor- und Nachname korrekt angezeigt. Nach einer weiteren Seitenanforderung ist req.User nicht mehr aktiv (Deserialisierung wird nicht aufgerufen).

Was mache ich falsch?

17
Sven

Verwenden Sie dynamische Helfer. Hier ist ein Beispiel für mein Barebone-Objekt user:

app.dynamicHelpers({
    user: function(req, res){
        var roles, name;

        if (req.session && req.session.auth == true) {
            roles = ['member'];
            name = (req.session.user) ? req.session.user.name : 'Registered member';
            id = (req.session.user) ? req.session.user.id : 0;
        }
        else {
            roles = ['guest'];
            name = 'Guest';
            id = null;
        }

        return {
            name: name, 
            id: id,
            roles: roles,
            isGuest: roles.indexOf('guest') !== -1,
            isAdmin: roles.indexOf('admin') !== -1
        }
    }
});

In Ansichten können Sie dann einfach #{user.name} oder if user.isAdmin usw. als Objekt verwenden. user ist jetzt für andere Teile der App verfügbar.

Sie können es zu app.js hinzufügen oder von einer externen Datei anfordern. Ich behalte alle meine dynamischen Helfer unter /utils/helpers.js

10
mvbl fst

Haben Sie Passport-Middleware eingestellt? Aus dem Dokument müssen Sie tun

app.configure(function() {
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.session({ secret: 'keyboard cat' }));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(YOUR_STATIC_DIR_PATH));
});

wenn Sie Express 3.x oder Connect 2.x verwenden, setzen Sie das Cookie-Geheimnis anstelle des Sitzungsgeheimnisses

app.configure(function() {
  app.use(express.cookieParser('keyboard cat'));
  app.use(express.session());
  app.use(express.bodyParser());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(YOUR_STATIC_DIR_PATH));
});
2
smagch

Gut, ich habe es verstanden:

Der Fehler, den ich gemacht habe, war nicht in dem Code, den ich oben gepostet habe, was richtig ist. Ich hatte eine falsche Art, auf URLs zu verlinken, und musste daher irgendwie jedes Mal, wenn ich einen der defekten Links verwendete, eine neue Sitzung erstellen. Mit der neuen Sitzung habe ich auch mein req.user-Objekt verloren.

Wenn Sie also ähnliche Probleme haben, überprüfen Sie auch Ihre Links in Ihrem HTML-Code.

Vielen Dank für Ihre Hilfe.

2
Sven

Sie können Benutzerinformationen zur Anzeige in Router übergeben:

res.render('user/dashboad', {
    ...
    user: req.session.passport.user,
    ...
0
Dung Vu