概论
此文档写法为测试写法,不代表发布版本。
由于我并不知道用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]