2016-06-06 11 views
0

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.

Antwort

2

Statt return (null, user) müssen Sie

return done(null, user) 

oder nur

done(null, user) 

in Ihrem login.js

nennen, es hilft!

+0

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: /. –