passportjs 源码分析

概论

此文档写法为测试写法,不代表发布版本。

由于我并不知道用passportjs与自己实现一个接口传入token进行校验相比有什么优势,或者说就是想要知道passportjs到底做了些什么事情,故有了这篇文章。

首先发现一个小技巧:package.json 文件中的设置main字段可以转移require此项目时的根目录。

目录结构

  • lib

    • errors
    • framework
    • http
    • middleware

      • session.js

    • strategies
    • authenticator.js
    • index.js

由于使用概论中的使用技巧,所以require此库时,会直接引用lib/index.js

实例 = new 类(),此过程称为实例化。let a = ‘123’;!!a === true,此处注意!!的用法。

  • lib/index.js 实例化一个lib/authenticator.js 中的类并导出。同时进行一系列赋值,如下(其中的passport-strategy为一个npm库passport-strategy,将在后面介绍):
let Instance = new require('lib/authenticator.js')();
/**
    类lib/authenticator.js主要内容为:见①
**/
Instance.Passport = Instance.Authenticator = require('lib/authenticator.js');
Instance.Strategy = require('passport-strategy');
Instance.strategies = {
    SessionStrategy: require('lib/strategies/session')
};
  • lib

    • errors
    • framework ③

      • connect.js ③① 回:②⑩②

        • 导出 __monkeypatchNode函数

          • 为http.IncomingMessage.prototype(称为IMP)对象(http为node原生模块)添加属性,如下:

            IMP.login = IMP.logIn = ④①①;
            IMP.logout = IMP.logOut = ④①②;
            IMP.isAuthenticated = ④①③;
            IMP.isUnauthenticated = ④①④;
    • http ④

      • request.js ④① 回: ③①

        • login/logIn() ④①①

          • 参数为(user, options, done)或者(user, done)或者(user)
          • this[this._passport.instance._userProperty || ‘user’] = user;
          • 如果options.session:

            • 参数中必须含有done函数,即使用回调模式
            • 调用this._passport.instance.serializeUser(user, this, 回调函数(err, obj):

              this._passport.session.user = obj;
              this.session[this._passport.instance._key] = obj;
              done()
          • 否者直接调用done()
        • logout/logOut() ④①②

          • this[this._passport.instance._userProperty || ‘user’] = null;
          • delete this._passport.session.user if existed.
        • isAuthenticated() ④①③

          • return !!this[this._passport.instance._userProperty || ‘user’]
        • isUnauthenticated() ④①④

          • return !④①③()
    • middleware

      • session.js

    • strategies ⑤

      • session.js ⑤①

        • 属性
        • 方法

          • authenticate

            • 参数为(req:{pauseStream, }, options)或者(req)
            • 如果存在req._passport.session.user或者其等于0:

              • 使用pause暂停输入流
              • req._passport.instance.deserializeUser(req._passport.session.user, req, 回调:

    • authenticator.js ②

      • 实例化后会直接执行init函数
      • 属性

        • _key = ‘passport’
        • _strategies = {} ②②
        • _serializers = []
        • _deserializers = []
        • _infoTransformers = []
        • _framework = null ②① 
        • _userProperty = ‘user’
      • 方法

        • framework(fw) ②⑩①

          • 设置属性 _framework = fw并返回该属性。
        • init ②⑩②

          • ②① = ②⑩①(③①)
          • ②⑩③(⑤①)
        • use ②⑩③ 回 ②⑩②

          • 参数为(name,strategy)或者(strategy)但strategy.name存在
          • ②②[name] = strategy
        • unuse
        • initialize
        • authenticate
        • authorize
        • session
        • serializeUser
        • deserializeUser
        • _strategy
    • index.js

[To be continued]

    原文作者:Eriasuitor
    原文地址: https://segmentfault.com/a/1190000018206853
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞