当前位置: 首页 > news >正文

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]

相关文章:

  • Google Play 下架 App 之后的替身制作
  • 安卓应用性能调试和优化经验分享
  • Redis 懒删除(lazy free)简史
  • vue全家桶+Koa2开发笔记(8)--开发网页
  • Mycat - 实现数据库的读写分离与高可用
  • 理解 JavaScript 中的 this
  • 块级、内联、内联块级
  • Spring Boot 运作原理
  • 虚拟机网络不通故障解决
  • 原型模式深入探讨-【设计模式4】
  • 撕掉普通程序员的标签,这才是真正的大数据工程师!
  • Spring基于XML方式配置事务
  • 程序员最讨厌的9句话,你可有补充?
  • 一些关于Rust在2019年的思考
  • 通信类
  • [PHP内核探索]PHP中的哈希表
  • 2019.2.20 c++ 知识梳理
  • javascript 哈希表
  • JavaScript异步流程控制的前世今生
  • log4j2输出到kafka
  • MySQL的数据类型
  • PHP CLI应用的调试原理
  • rc-form之最单纯情况
  • Shadow DOM 内部构造及如何构建独立组件
  • webpack入门学习手记(二)
  • 半理解系列--Promise的进化史
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何利用MongoDB打造TOP榜小程序
  • 使用API自动生成工具优化前端工作流
  • 应用生命周期终极 DevOps 工具包
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (03)光刻——半导体电路的绘制
  • (二)pulsar安装在独立的docker中,python测试
  • (二十三)Flask之高频面试点
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET BackgroundWorker
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET值类型变量“活”在哪?
  • /proc/vmstat 详解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ 转载 ] SharePoint 资料
  • [1127]图形打印 sdutOJ