2016-04-22 66 views
6

我正在基于angular.js + node.jsmongodb使用快速模板的简单博客网站上工作。 我用$http从角度控制器通过POST方法命名为一个名为users.js的API,其中登录使用passport.authenticate方法进行验证。 我需要护照本地登录策略users.js
但它不工作。有角度登录服务代码和节点用户API代码。 任何人都可以告诉我如何在角度和节点中使用passport.js?在用户如何使用角度节点应用程序的护照?

通过服务角路由

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

节点路由

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

护照局部策略

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

所以我想使用护照进行身份验证,但使用客户端模板/路由来保持正确的身份验证。

有人可以请指出我在正确的方向吗?或者告诉我,我所做的是完全错误的?

编辑:我跟我的代码得到的错误是它不是重定向到的个人资料页

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

Not a valid User

+0

发表您的身份验证策略也的代码。 – ayushgp

回答

2

默认情况下,LocalStrategy预计字典参数被命名为usernamepassword

如果你想使用email代替username,那么你应该在你的策略中定义它们:

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

对于你的情况,应该是:

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

我找到解决我的问题.. 如何使用pass-nodejs路由护照.......

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

我使用POST方法并击中节点(users.js)控制器并从中获取响应。如果用户身份验证成功,则会重定位到配置文件视图,否则将保留在登录视图中。

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

得到角侧throught POST方法也可用于认证护照本地方法,如果用户seccessfully验证,那么验证用户发送作为应答命中..

相关问题