上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

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

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6078

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-12-4 15:22:17 | 显示全部楼层 | 阅读模式

    前文

    之前已经分析到了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);
            }
         }

    那所有校验的流程全部都走通了

    结语

    撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3906

    回帖

    3826

    积分

    管理员

    积分
    3826

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-12-4 15:44:38 | 显示全部楼层
    remix呢?渣男!
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6078

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-12-4 16:01:24 | 显示全部楼层

    现在就去学!呜呜呜
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表