2016-02-05 65 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

相關問題