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

Roh*_*ant 10 node.js angularjs passport.js

我正在开发一个基于angular.js + node.jsmongodb使用快速模板的简单博客网站.我$http通过POST方法从角度控制器命中到一个名为api的api users.js,其中login使用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},
      })
Run Code Online (Sandbox Code Playgroud)

用户中的节点路由

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

护照本地策略

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('/');
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以指点我正确的方向吗?或者告诉我,我在做什么是完全被误导了?

编辑:我使用我的代码得到的错误是它没有重定向到个人资料页面

TypeError:POST http:// localhost:3000/users/login 500内部服务器错误

不是有效的用户

0xm*_*mtn 2

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

如果您想使用email而不是username,那么您应该在您的策略中定义它们:

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

对于你的情况,它应该是:

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);
    });
}
));
Run Code Online (Sandbox Code Playgroud)