如何将护照与角度节点应用程序一起使用?

Posted

技术标签:

【中文标题】如何将护照与角度节点应用程序一起使用?【英文标题】:how to use passport with angular node app? 【发布时间】:2016-08-15 14:03:25 【问题描述】:

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

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

有人可以指出我正确的方向吗?或者告诉我我所做的是否完全被误导了?

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

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

不是一个有效的用户

【问题讨论】:

也发布你的认证策略代码。 【参考方案1】:

默认情况下,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);
    );

));

【讨论】:

【参考方案2】:

我找到了我的问题的解决方案.. 如何在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 方法从 angular side 获得成功,如果用户通过身份验证,则使用本地护照方法进行身份验证,然后将经过身份验证的用户作为响应发送..

【讨论】:

以上是关于如何将护照与角度节点应用程序一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

角度如何与 Ionic 应用程序中的节点一起工作?

使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)

如何将 Azure 授权社交提供程序与静态 html 角度网站一起使用?

如何在节点/套接字应用程序中验证 laravel 护照 API 令牌?

带有本地护照的 TypeScript:不能将“new”与类型缺少调用或构造签名的表达式一起使用

req.user 未定义 - 节点 + 快递 + 护照-facebook