博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
passportjs 源码分析
阅读量:6837 次
发布时间:2019-06-26

本文共 2299 字,大约阅读时间需要 7 分钟。

概论

此文档写法为测试写法,不代表发布版本。

由于我并不知道用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]

转载地址:http://vwhkl.baihongyu.com/

你可能感兴趣的文章
GraphQL 初探—面向未来 API 及其生态圈
查看>>
# 小猪的Python学习之旅 —— 17.Python数据分析:我主良缘交友了解下
查看>>
10种避免大型部署的方法
查看>>
Oracle宣布提供新的Java支持价格体系
查看>>
JUnit 5发布
查看>>
为DevOps正确组合IT、文化和实践
查看>>
苹果推出开源医学研究框架ResearchKit
查看>>
如何在 Kubernetes 中对无状态应用进行分批发布
查看>>
图片即时优化的三种简单解决方案
查看>>
Eclipse发布MicroProfile 1.4和2.0
查看>>
Netflix发布Polly.JS,一个用于HTTP交互的开源库
查看>>
php生成sitemap
查看>>
AWS 开源 SageMaker,帮助开发人员优化机器学习模型
查看>>
NumSharp v0.8.0 发布,C# 张量计算库
查看>>
linux shell (4) - Loop 循环
查看>>
JFinal-layui v1.2.3 发布,极速开发企业应用系统
查看>>
GitLab 已迁移至谷歌云平台,并表示目前运行良好
查看>>
python Day1作业:用户三次登陆锁定
查看>>
镜像即代码:基于Packer构建阿里云镜像
查看>>
pg_dump 详解/使用举例
查看>>