2016-05-11 10 views
0

Ich bin eine gemeine Anwendung mit Reisepass zu entwickeln, und ich bin durch dieses Problem:Ändern Sie req.user oder verwenden Sie req.account?

Ich habe eine LocalStrategy, um den Benutzer basierend auf der Anwendungsdatenbank anmelden. Ich muss jedoch den Benutzer gleichzeitig auf einem anderen Dienst mit möglichen mehreren Konten anmelden. Die Sache ist, sobald ich route, um diese Logins zu autorisieren, und setze die Variablen auf req.account, kann ich nicht auf sie in anderen Routen zugreifen. Beachten Sie, dass ich die gewünschten Daten abrufen kann. Ich möchte nur von einer anderen Stelle als dieser Route darauf zugreifen, z. B. req.user. Ich werde etwas von meinem Code veröffentlichen, um die Situation zu klären.

Lokale Anmeldung Route

app.post('/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user) { 
     if (err) 
      return next(err); 
     if (!user) 
      return res.status(400).json({status: 'Invalid Username'}); 
     req.login(user, function (err) { 
      if (err) 
       return next(err); 
      res.status(200).json({status: 'User successfully authenticated'}); 
     }); 
    })(req, res, next); 
}); 

Lokale Login Pass Config

passport.use('local-login', new LocalStrategy(function (user, pswd, done) { 
    User.findOne({'username': user}, function (err, user) { 
     if (err) 
      return done(err); 
     if (!user || !user.validPassword(pswd)) 
      return done(null, false); 
     return done(null, user); 
    }); 
})); 

Der andere Dienstpass Config

passport.use('other-login', new OtherStrategy(function (docs, done) { 
    if (docs.length === 0) 
     return done(null, false); 

    var accounts = []; 
    var user, pswd, data; 
    var counter = docs.length; 
    for (var i = 0; i < docs.length; i++) { 
     user = docs[i]._id; 
     pswd = docs[i].password; 
     request.post(<serviceurl>, { 
      headers: { 
       'Content-Type': 'application/x-www-form-urlencoded' 
      }, 
      body: qs.stringify({ 
       grant_type: 'password', 
       username: user, 
       password: pswd, 
       client_id: process.env.API_KEY 
      }) 
     }, function (err, res, body) { 
      if (err) 
       return done(err); 
      data = JSON.parse(body); 
      data.username = docs[docs.length - counter]._id; 
      accounts.push(data); 
      counter--; 
      if (counter === 0) 
       return done(null, accounts); 
     }); 
    } 
})); 

Sonstige Service Route

router.get('/otherservice', passport.authorize('other-login', {}) , function (req, res) { 
    console.log(req.account); 
    res.sendStatus(200); 
}); 

Andere Service-Authentifizierung (von benutzerdefinierten Strategie)

ServiceStrategy.prototype.authenticate = function (req) { 
var self = this; 

var id = req.user.master_id || req.user.id; 
Service.find({master_id: id}, function (err, docs){ 
    if (err) 
     return self.error(err); 

    function verified(err, data, info) { 
     if (err) { return self.error(err); } 
     if (!data) { return self.fail(info); } 
     self.success(data, info); 
    } 

    try { 
     if (self._passReqToCallback) { 
      self._verify(req, docs, verified); 
     } else { 
      self._verify(docs, verified); 
     } 
    } catch (ex) { 
     return self.error(ex); 
    } 
});}; 

Antwort

1

fand ich die Lösung! Im Benutzermodell habe ich eine accounts-Eigenschaft hinzugefügt, um die Daten zu speichern, die für die Autorisierung zurückgegeben wurden. Dann habe ich auf der Autorisierungsroute den Benutzer mit dieser Information aktualisiert und gespeichert. Es war überhaupt nicht so schwer.

app.post('/api/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user) { 
     if (err) 
      return next(err); 
     if (!user) 
      return res.status(400).json({status: 'Invalid Username'}); 
     req.login(user, function (err) { 
      if (err) 
       return next(err); 
      var id = req.user.master_id || req.user.id; 
      Service.findOne({master_id: id}, function (err, doc) { 
       if (doc == null) 
        res.status(200).json({ 
         status: 'User successfully authenticated', 
         accounts: false 
        }); 
       else 
        return next(); 
      }); 
     }); 
    })(req, res, next); 
}, passport.authorize('other-login', {}), function (req, res) { 
    var accounts = req.account; 
    var user = req.user; 
    user.accounts = accounts; 
    user.save(function (err, newUser) { 
     if (err) 
      throw err; 
     res.status(200).json({ 
      status: 'User sucessfully authenticated', 
      accounts: true 
     }); 
    }) 
});