2016-04-22 4 views
6

Ich arbeite an einer einfachen Blog-Website basierend auf angular.js + node.js und mongodb mit Express-Vorlage. Ich schlug mit $http von Winkel-Controller per POST-Methode auf eine API namens users.js, wo Login mit passport.authenticate Methode authentifiziert wird. Ich benötige Pass-lokale Login-Strategien in users.js.
Aber es funktioniert nicht. Hier gibt es eckigen Login-Service-Code und Knoten Benutzer API-Code. Kann mir jemand sagen, wie kann passport.js in Winkel und Knoten verwendet werden?Wie benutze ich einen Pass mit eckiger Knoten-App?

Winkelführung durch einen Service

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

Knoten Routing-in user

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

Pass lokale Strategie

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('/'); 
} 

Also ich möchte mit Pass authentifizieren, aber die Client-Seite Templating/Routing verwenden, um die ordnungsgemäße Authentifizierung zu halten.

Kann mir bitte jemand in die richtige Richtung zeigen? Oder sag mir, ob das, was ich tue, völlig fehlgeleitet ist?

edit: die Fehler, die ich mit meinem Code bin immer ist es nicht Seite

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

Not a valid User

+0

Beitrag gesendet werden authentifiziert wird. – ayushgp

Antwort

2

Standardmäßig Profile Umleitung LocalStrategy Wörterbuch Parameter genannt werden username und password erwartet.

Wenn Sie email statt username verwenden möchten, dann sollten Sie sie in Ihrer Strategie definieren:

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

Für Ihren Fall sollte es sein:

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

i Lösung gefunden zu meinem Frage .. wie Reisepass mit eckigen-nodejs Routing zu verwenden .......

//angular js routing 
$scope.userlogin=function(){ 
    $http({ 
     method:"post", 
     url:'/users/login', 
     data:{username:$scope.username,password:$scope.password}, 
    }).success(function(response){ 
     $scope.userData = response; 
     $localStorage.userData = $scope.userData; 
     console.log("success!!"); 
     $location.path("/profile") 
    }).error(function(response){ 
     console.log("error!!"); 
     $location.path("/login") 
    }); 
} 

Ich benutze die POST-Methode und hit to node (users.js) -Controller und bekomme Antwort von ihm. Wenn die Benutzerauthentifizierung erfolgreich ist, wird sie in die Profilansicht verschoben, andernfalls verbleiben sie in der Anmeldesicht.

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

erhalten einen Treffer von Winkelseite Throught post-Methode es Pass-local-Methode für die Authentifizierung verwenden, wenn der Benutzer seccessfully dann authentifizierten Benutzer als Antwort .. auch den Code der Authentifizierungsstrategie