2014-10-10 18 views
5

Sto provando a utilizzare AJAX per chiamare una verifica di accesso utilizzando la libreria Passport su un'applicazione Express. Im usando strategia locale in questo modo:jQuery Chiamata AJAX al login Passportjs su Express (nodejs) Framework

router.post('/login', function(req, res, next) { 


    passport.authenticate('loginUsers', function(err, user, info) { 

    if (err) { 
     return next(err); 
    } 
    // if user is not found due to wrong username or password 
    if (!user) { 
     //return res.render('login', {}); 
     res.json({detail: info}); 
    }//(!user) 
    //passport.js has a logIn user method 

    req.logIn(user, function(err) { 

     if (err) { return next(err); } 
     return res.render('account', {}); 
    }); //req.logIn 
    })(req, res, next); 
}); 

Il problema è che non so come passare le variabili a Passport, emulando la funzionalità bodyparser.json(), nel tentativo di fare qualcosa di simile:

$(document).ready(function() { 


    $('form').submit(function() { 
     $.ajax({ 
     type:'POST', 
     url:'/login', 
     data: {username: $('#us').val(), password: $('#pass').val()}, 
     success:function(result){ 
      if(!result){ 
       //$('form input[name="username"]').css("background-color", "red"); 
      } 

     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      console.log(xhr.status); 
      console.log(thrownError); 
     } 
     }); 


     return false; 
    }); 

}); 

EDIT-

la mia strategia:

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

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


passport.use('loginUsers', new LocalStrategy(

    function(username, password, done) { 
    users.findOne({email: username}, function(err, user) { 

     if (err) { return done(err); } 

     if (!user) { 

     console.log('[+] DB: user/password failure'.red); 
     return done(null, false, {error: ''}); 

     }else if(!bcrypt.compareSync(password, user.hashed_password)){ 

     console.log(("[+] Password error").red); 
     return done(null, false, {error: ''}); 

     }else if(user.verified === false){ 

      console.log("[+] DB: user not verified"); 
      return done(null, false, {error: ''}); 

     }else{ 

     console.log("[+] DB: user/password success".green); 
     return done(null, user); 
     } //else 
    }); //findOne 
    } 
)); 

Errore sul passaggio delle credenziali persistono, im Geting:

oggetto {dettaglio: Oggetto} dettaglio: ObjectMessage: "credenziali mancanti" proto:

Qualcuno mi può punto nella giusta direzione?

risposta

7

Questo dovrebbe funzionare, non verificato, fammi sapere se ci sono errori di battitura.

In sostanza, è necessario l'app Express per ascoltare una richiesta POST su/login, in questo percorso è possibile aggiungere l'autenticazione del passaporto.

app.post('/login', function(req, res, next) { 
    passport.authenticate('loginUsers', function(err, user, info) { 
     if (err) { return next(err); } 
     if (!user) { return res.render('account'); } 
     req.logIn(user, function(err) { 
      if (err) { return next(err); } 
      return res.json({detail: info}); 
     }); 
    })(req, res, next); 
}); 

Inoltre, nella vostra strategia, assicurarsi che il nome campi siano corretti cioè:

passport.use('loginUsers',new LocalStrategy({ 
      usernameField : 'username', 
      passwordField : 'password', 
      passReqToCallback : true 
     }, 
+0

Ho modificato la domanda originale, sto facendo che (percorso post) ma non posso passare le variabili da passaporto correttamente Grazie – mdv

+0

come è la tua strategia locale? – xShirase

+0

vedi aggiornamento alla domanda originale. – mdv

Problemi correlati