前文
之前已经分析到了Strategy的注册
这次我们来分析到底怎么执行的Strategy的相关逻辑
正文
可以知道passport.authenticate最后调用了strategy.authenticate(req, options);
也就是策略自身的authenticate,我们用的passport-local
我们去看看他的验证函数
*/
Strategy.prototype.authenticate = function(req, options) {
options = options || {};
var username = lookup(req.body, this._usernameField) || lookup(req.query, this._usernameField);
var password = lookup(req.body, this._passwordField) || lookup(req.query, this._passwordField);
if (!username || !password) {
return this.fail({ message: options.badRequestMessage || 'Missing credentials' }, 400);
}
var self = this;
function verified(err, user, info) {
if (err) { return self.error(err); }
if (!user) { return self.fail(info); }
self.success(user, info);
}
try {
if (self._passReqToCallback) {
this._verify(req, username, password, verified);
} else {
this._verify(username, password, verified);
}
} catch (ex) {
return self.error(ex);
}
};
可以看到就是简单读取了一些属性,然后回调了_verify
传入verified作为函数的done函数
这里个_verify1是由PassportStrategy做了一层劫持类,
会调用
const callback = (...params) => __awaiter(this, void 0, void 0, function* () {
const done = params[params.length - 1];
try {
const validateResult = yield this.validate(...params);
if (Array.isArray(validateResult)) {
done(null, ...validateResult);
}
else {
done(null, validateResult);
}
}
catch (err) {
done(err, null);
}
});
这里取了最后一个作为done,然后调用this.validate,并且等待结果,最后调用done返回去
这里的this.validate就是我们自己的validate函数了~
那我们看done之后做了什么
function verified(err, user, info) {
if (err) { return self.error(err); }
if (!user) { return self.fail(info); }
self.success(user, info);
}
调用了自身的self.success,self就是this,也就是在passport写上的
这里会回调到我们的this.handleRequest函数上,也就是我们自己的处理结束函数~
strategy.success = function(user, info) {
if (callback) {
return callback(null, user, info);
}
}
那所有校验的流程全部都走通了
结语
撒花~