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);
}
});};