李恒道 发表于 2022-12-4 15:22:17

nestjs passport及@nestjs/passport源码级分析(五)

# 前文
之前已经分析到了Strategy的注册
这次我们来分析到底怎么执行的Strategy的相关逻辑
# 正文
可以知道passport.authenticate最后调用了strategy.authenticate(req, options);
也就是策略自身的authenticate,我们用的passport-local
我们去看看他的验证函数
```js
*/
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做了一层劫持类,
会调用
```js
            const callback = (...params) => __awaiter(this, void 0, void 0, function* () {
                const done = params;
                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之后做了什么
```js
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函数上,也就是我们自己的处理结束函数~
```js
   strategy.success = function(user, info) {
      if (callback) {
          return callback(null, user, info);
      }
   }
```
那所有校验的流程全部都走通了
# 结语
撒花~

王一之 发表于 2022-12-4 15:44:38

remix呢?渣男!

李恒道 发表于 2022-12-4 16:01:24

王一之 发表于 2022-12-4 15:44
remix呢?渣男!

现在就去学!呜呜呜
页: [1]
查看完整版本: nestjs passport及@nestjs/passport源码级分析(五)