passport.js中的身份验证,与角度js一起使用

sab*_*ari 2 angularjs angularjs-scope angularjs-routing

我从以下链接http://passportjs.org/guide/authenticate/了解到在passport.js中使用身份验证方法

在我的项目中,我有以下代码:

app.post('/login', function(req, res, next) {
        passport.authenticate('local', function(err, user, info) {
            if (err) { console.log(err); return next(err) }
            if (!user) {
                return res.json(400, info);
            }
            req.logIn(user, function(err) {
                if (err) { return next(err); }
                return res.json(200, {user_id: user._id, url:"/user/home"});
            });
        })(req, res, next);
    });
Run Code Online (Sandbox Code Playgroud)

我在另一个文件中调用了/ login url,如下所示

 $http.post('/login', $scope.user).
              success(function(data, status, headers, config) {
                $window.location.href= data.url ? data.url : '/';
                $scope.view.loading = false;
              }).error(function(data, status, headers, config) {
                console.log(data);
                $scope.view.loading = false;
                $scope.view.submitted = true;
                $scope.view.serverError=data.message ? data.message : "Server Error!";
              });
Run Code Online (Sandbox Code Playgroud)

我的疑问是,passport.authenticate如何知道用户凭据.在调用http.post时,我们也发送$ scope.user.但那只是'数据'.为什么passport.authenticate知道对象'用户'?

Dec*_*oon 6

不是100%肯定你的确切要求,但我会试一试.

如果用户名/密码对匹配,您负责告诉Passport,然后向Passport提供与给定用户名(或电子邮件或其他)对应的用户对象.这可以在:passport.use(new LocalStrategy( ... ));指定此逻辑的位置完成.(您可以在官方网站上找到有关如何执行此操作的示例代码.)然后,Passport会在会话中序列化此用户对象,同样通过您指定的逻辑:

passport.serializeUser(function (user, done) {
    // Only store the user id in the session
    done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    // Find the user with the given id
    User.find(id).done(function (err, user) {
        done(err, user);
    });
});
Run Code Online (Sandbox Code Playgroud)

user该护照传递给你的回调函数对象passport.authenticate是非常相同的user,你给护照作为本地策略的结果对象.

所以这里是事件的细分:

  1. 您将用户名/密码(或电子邮件/密码)对POST /登录.
  2. Express收到请求并将其路由到相应的处理程序.
  3. 您可以执行passport.authenticate(...)通过给它req,res以及next从处理程序给你的对象.
  4. Passport执行您指定的登录逻辑passport.use(new LocalStrategy(...)).如果user逻辑进程给出了有效对象,则passport会将此对象传递给回调函数,以便您可以返回用户(或其他)的详细信息.