如何使用带有角度节点应用程序的护照?

时间:2016-04-22 05:14:45

标签: angularjs node.js passport.js

我正在开发一个基于angular.js + node.jsmongodb的简单博客网站,使用快速模板。 我通过POST方法从角度控制器点击$http到名为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内部   服务器错误

     

不是有效用户

2 个答案:

答案 0 :(得分:3)

我找到了解决问题的方法.. 如何使用带有angular-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);
 });

通过post方法从角边获取命中如果用户成功通过验证,则使用护照本地方法进行身份验证,然后将经过身份验证的用户作为响应发送..

答案 1 :(得分: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);
    });
}
));