2016-02-05 21 views
0

我正在使用passport.js和LocalStrategy方法在node.js中为我的项目进行基本身份验证。它甚至还没有密码验证。帐户存储在MongoDB实例中。来自angular.js的POST不起作用,但直接从窗体工作。为什么?

我被困了整整一天当我当然要通过教师推荐的表单数据绑定到角,并从那里发送$http.post(),就像这样:

$scope.signIn = function (username, password) { 
    $http.post('/login', {username: username, password: password}) 
     .then(function (res) { 
      if(res.data.success) { 
       console.log('Logged in'); 
      } else { 
       console.log('error logging in'); 
      } 
     }) 
}; 

下面是它的路线:

app.post('/login', function (req, res, next) { 

    var auth = passport.authenticate('local', function (err, user) { 
     if(err) { return next(err); } 
     if(!user) { res.send({success: false, user: user}); } 

     req.login(user, function (err) { 
      if(err) { return next(err); } 
      res.render('index', { success: true, user: user }); 
     }); 
    }); 

    auth(req, res, next); 
}); 

除了总是返回{success:false,user:false}。谷歌上搜索吨后,我决定直接从形式作出POST请求:

JADE:

.navbar-right(ng-controller='navbarLoginCtrl') 
form.navbar-form(action='/login' method='post') 
    .form-group 
     input.form-control(name='username' placeholder='username', ng-model='username' required) 
    .form-group 
     input.form-control(name='password' type='password', placeholder='password', ng-model='password' required) 
    button.btn.btn-default(type='submit' value="Submit") Sign in 

,而不是:

.navbar-right(ng-controller='navbarLoginCtrl') 
form.navbar-form 
    .form-group 
     input.form-control(name='username' placeholder='username', ng-model='username' required) 
    .form-group 
     input.form-control(name='password' type='password', placeholder='password', ng-model='password' required) 
    button.btn.btn-default(ng-click='signIn(username, password)') Sign in 

提交方法确实有效,但我” d喜欢保持干净的东西,并做到有角度。 我该怎么办?参考

其他passport.js组件:

var User = mongoose.model('User'); 

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

passport.deserializeUser(function (id, done) { 

    User.findOne({_id: id}).exec(function (err, user) { 
     if(user) { 
      return done(null, user); 
     } else { 
      return done(null, false); 
     } 
    }); 
}); 

passport.use(new LocalStrategy(
    function (username, password, done) { 
     User.findOne({username: username}, function (err, user) { 
      if (user) return done(null, user); 
      else return done(null, false); 
     }); 
    } 
)); 

回答

1

您应该检查你的浏览器发送。

您的浏览器表单以“username = & password =”的形式发送数据,角度以JSON {username:,password:}发布,而Content-Type标题不同。

如果你想要做相同的角度:

var headers={ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'};   
     return $http.post(BackEndpoint+'/login','username='+username+'&password='+password, 
    {headers:headers}).then(function(result){ 
}); 

这是我用来对付春季认证。

+0

谢谢,这个伎俩。惭愧,这绝对没有提到它,甚至passport.js文档。我只是假定body-parser会为我处理这件事。 任何想法,为什么它可以在早期版本的Express/node中工作而不明确specyfing内容类型? – Ketus

+0

绝对不知道我只知道表单发布和角度发布的区别:) – Walfrat

相关问题