首页 文章

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

提问于
浏览
9

我正在使用快速模板基于 angular.js + node.jsmongodb 创建一个简单的博客网站 . 我通过POST方法从角度控制器中使用 $http 命名为名为 users.js 的api,其中使用 passport.authenticate 方法对登录进行身份验证 . 我需要 users.js 中的护照本地登录策略 .
但它不起作用 . 角度登录服务代码和节点用户api代码 . 任何人都可以告诉我如何在角度和节点中使用 passport.js

angular routing through a service

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},
      })

node routing in user

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

passport-local strategy

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

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

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

edit : 我使用我的代码得到的错误是它没有重定向到 Profiles 页面

TypeError:POST http:// localhost:3000 / users / login 500内部服务器错误不是有效用户

2 回答

  • 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方法从角边获取一个命中它如果用户认证成功则使用护照本地方法进行身份验证然后通过身份验证的用户作为响应发送 .

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

相关问题