当前位置: 首页 > 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年的思考
  • 通信类
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2019年如何成为全栈工程师?
  • 30天自制操作系统-2
  • canvas 高仿 Apple Watch 表盘
  • React-生命周期杂记
  • Spring Boot MyBatis配置多种数据库
  • SQLServer之创建显式事务
  • Web Storage相关
  • 仿天猫超市收藏抛物线动画工具库
  • 好的网址,关于.net 4.0 ,vs 2010
  • 检测对象或数组
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 通过npm或yarn自动生成vue组件
  • 一、python与pycharm的安装
  • 一份游戏开发学习路线
  • 移动端 h5开发相关内容总结(三)
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​香农与信息论三大定律
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #ifdef 的技巧用法
  • #laravel 通过手动安装依赖PHPExcel#
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ZT)薛涌:谈贫说富
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (论文阅读40-45)图像描述1
  • (七)c52学习之旅-中断
  • (转载)OpenStack Hacker养成指南
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET使用存储过程实现对数据库的增删改查
  • @Pointcut 使用