Ich habe versucht, einen Server als Back-End für eine Android-Anwendung einzurichten. Sichere & autorisierende RESTful API ist hoffentlich eine Kernfunktionalität.pass.js post login return nicht angerufen
Jetzt habe ich vor kurzem den Pass entdeckt, und ich habe mich nach einigen Kämpfen (speziell mit Rückrufen) endlich völlig festgefahren.
Ich habe eine ziemlich "genaue" Übereinstimmung zwischen meiner POST-Register-Funktionalität (die funktioniert) und meine POST-Login-Funktionalität (die funktioniert bis die Rückkehr getan (null, Benutzer), die nur nicht aufgerufen wird, scheint es .
Der gesamte Code ist sichtbar: https://github.com/mathieudevos/pinkiponki
So in routes.js
//Login
router.post('/login', passport.authenticate('login', {failWithError: true}),
function(req, res, next){
// Handle success
log('Everything went ok. ' + req.user.username); //This never gets called, timeout before.
httpResponses.sendLoginOK(res, req.user.username);
return ;
},
function(err, req, res, next){
// Handle error
return res.json(err);
}
);
//Register
router.post('/register', passport.authenticate('register', {failWithError: true}),
function(req, res, next){
// Handle success
httpResponses.sendRegisterOK(res, req.user.username);
return ;
},
function(err, req, res, next){
// Handle error
return res.json(err);
}
);
Login.js:
// login!
passport.use('login', new localStrategy({
passReqToCallback: true
},
function(req, username, password, done) {
users.findOne({'username': username}, function(err, user){
if (err){
log('Error: ' + err.toString());
return done(err);
}
if (!user) {
log('Could not find user');
return done(null, false, {message: 'Fail login: ' + username});
}
if (!user.validatePassword(password)) {
log('Wrong password');
return done(null, false, {message: 'Fail login: ' + username});
}
log('All is good! \n' + user.toString());
return (null, user);
});
}
));
Und registrieren:
// register!
passport.use('register', new localStrategy({
passReqToCallback: true
},
function(req, username, password, done) {
users.findOne({username: req.body.username}, function(err, user){
if (err){
return done(null, false, {error: err.toString()});
}
if (user){
// User already exists
return done(null, false, {message: 'User already exists'});
}
if(password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) && password.length > 4 && password.match(/[0-9]/) && password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)){
var newuser = new users({
username: username,
email: req.body.email,
firstname: req.body.firstname,
lastname: req.body.lastname,
password: generateHash(password),
about: req.body.about,
rating: 1200
});
newuser.save(function (err){
if (err) {return done(null, false, {error: err.toString()});}
return done(null, newuser, {username: username});
});
} else {
return done(null, false, {message: 'Password not strong enough.'});
}
});
}));
// generate hash (bcrypt)
var generateHash = function(password){
return bCrypt.hashSync(password, bCrypt.genSaltSync(10));
};
Wenn ich laufen:
curl -x POST http://localhost:9721/register -d '{"username": "Testname", "email":"[email protected]","password":"[email protected]","firstname":"test","lastname":"super","about":"this is a test."}' -H 'Content-Type: application/json'
ich mit Benutzername willkommen bin: Testname
Wenn ich nun die einfache Login laufen:
curl -x POST http://localhost:9721/login -d '{"username": "Testname", "password": "[email protected]"}' -H 'Content-Type: application/json'
Dann mein Log sh Es läuft schön die Schritte in meinem Login-Teil und meine Protokolle zeigen sogar, dass user.toString() der richtige Benutzer ist.
Jetzt scheint die Rückkehr (Null, Benutzer) vollständig zu hängen und die Funktionalität in routes.js wird nie aufgerufen (somit werden auch meine httpResponses nie aufgerufen).
Jeder hat irgendwelche Ideen, wie man damit umgeht?
Auch jede Dokumentation darüber, wie man einfach mit einer einfachen JSON-Nachricht auf den Benutzer antwortet (Ich habe bereits den failWithError ausprobiert, aber das einzige, was ich daraus bekomme, ist unAuthorized 401, ich kann keine benutzerdefinierten Nachrichten haben).
Die Idee ist, all dies einzurichten, um mit Retrofit (RESTful JSON) auf Android zu verwenden und diese Funktionalität von pass/nodejs/mongoose als Back-End für meine Anwendung zu verwenden.
Wenn Sie mehr Code benötigen, stelle ich Ihnen gerne weiteren Code zur Verfügung.
Heilig, kann nicht glauben, dass ich darüber schaute! Gibt es Tipps, wie Sie die json-Nachrichten im Antwortteil besser behandeln können?Wenn möglich, würde ich nur meine httpResponses behandeln, indem Sie sie als httpResponses (res, message) verwenden, aber ich habe Probleme, die Antworten zu bekommen: /. –