2016-04-22 3 views
6

私は、エクスプレステンプレートを使用してangular.js + node.jsmongodbに基づいて簡単なブログのウェブサイトに取り組んでいます。 POSTメソッドで角度コントローラーからusers.jsという名前のAPIに$httpでヒットしました。ログインは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名前を付けることを期待しています。あなたの代わりにusernameemailを使用したい場合は

、あなたはあなたの戦略でそれらを定義する必要があります:あなたのケースのために

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

は、私は解決策を見つけた私質問... .. 角度ノードのルーティングでパスポートを使用する方法.......

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

は、ユーザーが認証されたユーザが応答として送信されるseccessfully認証された場合、それは認証のためにパスポートローカルメソッドを使用し、角側throught POSTメソッドからのヒット...

関連する問題