passportjs 源碼分析

概論

此文檔寫法爲測試寫法,不表明發布版本。

因爲我並不知道用passportjs與本身實現一個接口傳入token進行校驗相比有什麼優點,或者說就是想要知道passportjs到底作了些什麼事情,故有了這篇文章。node

首先發現一個小技巧:package.json 文件中的設置main字段能夠轉移require此項目時的根目錄。

目錄結構

  • libnpm

    • errors
    • framework
    • http
    • middlewarejson

      • session.jssession

    • 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 ③ui

      • connect.js ③① 回:②⑩②this

        • 導出 __monkeypatchNode函數prototype

          • 爲http.IncomingMessage.prototype(稱爲IMP)對象(http爲node原生模塊)添加屬性,以下:code

            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]

相關文章
相關標籤/搜索