2016-04-22 30 views
6

Sto lavorando a un semplice sito Web di blog basato su angular.js + node.js e mongodb utilizzando il modello espresso. Ho colpito con $http dal controller angolare con metodo POST su una API denominata users.js in cui l'accesso è autenticato utilizzando il metodo passport.authenticate. Ho bisogno di strategie di accesso passaporto-locale in users.js.
Ma non funziona. C'è un codice di servizio di accesso angolare e codice API degli utenti del nodo. Qualcuno può dirmi come usare passport.js in angolare e nodo?come utilizzare il passaporto con l'app nodo angolare?

instradamento angolare attraverso un servizio

app.service('Auth',function($location,$http,$localStorage){     
    var userLogin ; 
    return{ 
    setLogIN:function(email,password){ 
     $http({ 
     method: 'POST', 
     url: '/users/login', //users.js having node routing. 
     data: {email:email, password:password}, 
     }) 

nodo di distribuzione in uso

router.post('/login',passport.authenticate('local', { 
    // use passport-local for authentication 
    successRedirect : '/profile', 
    failureRedirect : '/login', 
    failureFlash : true 
})); 

tessera locale strategia

app.use(passport.initialize()); 

app.use(passport.session()); 
passport.use(new LocalStrategy(
    function (username, password, done) { 

     User.findOne({username: username}, function (err, user) { 

      if (err) { 
       return done(err); 
      } 
      if (!user) { 
       return done(null, false, {alert: 'Incorrect username.'}); 
      } 
      if (user.password != password) { 
       return done(null, false, {alert: 'Incorrect password.'}); 
      } 
      return done(null, user); 
     }); 
    } 

)); 


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

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 

function isAuthenticated(req,res,next){ 
    if(req.isAuthenticated())return next(); 
    res.redirect('/'); 
} 

Quindi voglio autenticarmi usando il passaporto, ma uso il templating/routing lato client per mantenere l'autenticazione corretta.

Qualcuno può indicarmi la direzione giusta? O dimmi se quello che sto facendo è completamente fuorviato?

edit: l'errore che sto ottenendo con il mio codice è che non è il reindirizzamento alla pagina profilo

TypeError: POST http://localhost:3000/users/login 500 Internal Server Error

Not a valid User

+0

pubblicare il codice della vostra strategia di autenticazione anche. – ayushgp

risposta

2

Per impostazione predefinita, LocalStrategy aspetta parametri del dizionario per essere nominato username e password.

Se si desidera utilizzare email invece di username, allora li si dovrebbe definire nella vostra strategia:

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    // ... 
    } 
)); 

Per il vostro caso, dovrebbe essere:

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
    }, 
function (username, password, done) { 

    User.findOne({username: username}, function (err, user) { 

     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, {alert: 'Incorrect username.'}); 
     } 
     if (user.password != password) { 
      return done(null, false, {alert: 'Incorrect password.'}); 
     } 
     return done(null, user); 
    }); 
} 
)); 
2

ho trovato soluzione al mio domanda .. come utilizzare il passaporto con il routing angular-nodejs .......

uso il metodo POST e il comando hit to node (users.js) e ottengo risposta da esso. se l'autenticazione dell'utente ha esito positivo, passa alla vista profilo altrimenti rimane nella vista accesso.

//add these two lines to app.js 
// var app = express(); 
app.use(passport.initialize()); 

app.use(passport.session()); 

//node routing 
// add passport-stretegies to users.js 
passport.use(new LocalStrategy(function(username, password, done) { 
    user.findOne({username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (user.password != password) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
     // console.log(user) 
    }); 
})); 

//passport serialize user for their session 
passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 
//passport deserialize user 
passport.deserializeUser(function(id, done) { 
    user.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 

//router on same page 
router.post('/login',passport.authenticate('local'),function(req,res){ 

res.send(req.user); 
    //console.log(req.user); 
}); 

ottenere un successo da una parte angolare metodo throught post it utilizzare il metodo del passaporto-locale per l'autenticazione se l'utente è autenticato seccessfully allora utente autenticato viene inviato come risposta ..