我试图弄清楚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
实际上是配置过程中定义的验证回调。