概论
此文档写法为测试写法,不代表发布版本。
由于我并不知道用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库,将在后面介绍):
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:
- 使用暂停输入流
-
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]