【问题标题】:Authentication in passport.js , used with angular jspassport.js 中的身份验证,与 Angular js 一起使用
【发布时间】:2014-02-08 09:46:19
【问题描述】:

我从下面的链接了解了在 passport.js 中使用 authenticate 方法 http://passportjs.org/guide/authenticate/

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

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

我在另一个文件中调用了 /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!";
              });

我的疑问是,passport.authenticate 是如何知道用户凭据的。 在调用 http.post 的同时,我们还发送了 $scope.user。但这只是“数据”。 passport.authenticate 怎么会知道对象“用户”?

【问题讨论】:

    标签: angularjs angularjs-scope angularjs-routing


    【解决方案1】:

    不能 100% 确定您的确切要求,但我会试一试。

    如果用户名/密码对匹配,您有责任告诉 Passport,然后将与给定用户名(或电子邮件或其他)对应的用户对象提供给 Passport。这是在:passport.use(new LocalStrategy( ... )); 中完成的,您可以在其中指定此逻辑。 (您可以在官方网站here 上找到示例代码以了解如何执行此操作。)然后 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);
        });
    });
    

    passport 在对passport.authenticate 的回调函数中传递给您的user 对象与您根据本地策略提供passport 的user 对象完全相同。

    以下是事件的细分:

    1. 您将用户名/密码(或电子邮件/密码)对发布到 /login。
    2. Express 接收请求并将其路由到适当的处理程序。
    3. 您可以通过将处理程序提供给您的reqresnext 对象来执行passport.authenticate(...)
    4. Passport 执行您在passport.use(new LocalStrategy(...)) 中指定的登录逻辑。如果作为逻辑过程的结果,它被赋予了一个有效的user 对象,那么passport 会将此对象传递给回调函数,以便您可以返回用户的详细信息(或其他)。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2013-06-29
      • 2018-02-17
      • 2023-04-03
      • 1970-01-01
      • 2015-01-09
      • 2014-07-01
      • 2018-05-03
      • 2023-04-05
      相关资源
      最近更新 更多