Passport.js:验证回调的工作原理是什么?

时间:2017-12-14 03:50:12

标签: passport.js

我试图弄清楚Passport.js身份验证机制。对我来说有一个令人困惑的地方。

以下是.use()功能的实施:

Authenticator.prototype.use = function(name, strategy) {
  if (!strategy) {
    strategy = name;
    name = strategy.name;
  }
  if (!name) { throw new Error('Authentication strategies must have a name'); }

  this._strategies[name] = strategy;
  return this;
};

我的理解是这个函数将strategy注册到_strategies属性中。

例如,我使用JWT策略如下:

passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    User.findOne({id: jwt_payload.sub}, function(err, user) {
        if (err) {
            return done(err, false);
        }
        if (user) {
            return done(null, user);
        } else {
            return done(null, false);
            // or you could create a new account
        }
    });
}));

提供了verify callback。因此,通过这种方式,配置了身份验证策略。

然后在API路由中,我们可以使用passport.authenticate('jwt')方法作为中间件来验证传入的请求。

我检查Passport.js(authenitcate.js文件)的实现。我发现实际上,将为auth进程调用命名策略的authenticate函数。

那么验证回调如何工作?它何时何地被称为?

编辑: 经过更多调试后,我发现在特定策略的身份验证功能中调用了验证回调。以下是passport-jwt策略:

JwtStrategy.prototype.authenticate = function(req, options) {
    var self = this;

    var token = self._jwtFromRequest(req);

    if (!token) {
        return self.fail(new Error("No auth token"));
    }

    this._secretOrKeyProvider(req, token, function(secretOrKeyError, secretOrKey) {
        if (secretOrKeyError) {
            self.fail(secretOrKeyError)
        } else {
            // Verify the JWT
            JwtStrategy.JwtVerifier(token, secretOrKey, self._verifOpts, function(jwt_err, payload) {
                if (jwt_err) {
                    return self.fail(jwt_err);
                } else {
                    // Pass the parsed token to the user
                    var verified = function(err, user, info) {
                        if(err) {
                            return self.error(err);
                        } else if (!user) {
                            return self.fail(info);
                        } else {
                            return self.success(user, info);
                        }
                    };

                    try {
                        if (self._passReqToCallback) {
                            self._verify(req, payload, verified);
                        } else {
                            self._verify(payload, verified);
                        }
                    } catch(ex) {
                        self.error(ex);
                    }
                }
            });
        }
    });
};

self._verify实际上是配置过程中定义的验证回调。

0 个答案:

没有答案