passport源码研究
passport的验证过程主要依赖具体的验证策略来实现的,比较常用的有session策略、local策略和github策略等,验证逻辑都是在这些策略类中定义的。passport模块的定义主要包括三个部分:passport类、相关中间件和验证策略,passport自带了session验证策略,如果要使用其他验证策略,需要自行添加。
passport的使用分为五个部分:
- 首先必须通过
app.use(passport.initialize())对passport进行初始化,否则后面的验证方法无法执行 - 在全局范围内添加session验证中间件,
app.use(passport.session());,这个主要是为了记住用户的登录状态,可以指定session过期时间 - 给passport添加验证策略
- 在具体的路由上使用第三步中添加的验证中间件
- 给passport定义序列化和反序列化函数
本文没有对passport进行深入的分析,具体请参考注释版源码。
1、passport类
依赖于 ./framework/connect 和 ./strategies/session
主要属性:
this._key = 'passport'; //挂载在session上的关键字
this._strategies = {}; //保存所有验证策略的对象
this._serializers = []; //序列化session
this._deserializers = []; //反序列化session
this._infoTransformers = [];
this._framework = null; //保存所有中间件的对象
this._userProperty = 'user'; //挂载在req上的关键字 req.user
Authenticator.prototype.init
进行相关初始化,添加authenticate和initialize中间件,添加session验证策略 。给req对象添加login、logout、isAuthenticated和isUnAuthenticated方法
Authenticator.prototype.framework
passport暴露的中间件是类似于connect风格的,签名如:fn(req, res, next),而有的框架需要的是不同的签名风格,因此,该方法是用来做适配的,如果使用的是express框架,则不需要调用该方法。将传入的参数保存到this._framework中,参数如下:
{
initialize: initialize,
authenticate: authenticate
}
Authenticator.prototype.use
添加具体验证策略对象,并保存到this._strategies中,策略对象必须提供名称,例如:
passport.use('local',new LocalStrategy(function(username,password,done){ //todo });
Authenticator.prototype.unuse
根据策略名称,删除this._strategies中对应的验证策略对象,例如:passport.unuse('local');
Authenticator.prototype.initialize
设置this._userProperty,然后调用this._framework.initialize方法生成一个初始化中间件,并返回该中间件
Authenticator.prototype.authenticate
调用this._framework.authenticate方法生成一个验证中间件,并返回该中间件
2、 middleware - 相关中间件
主要包括initialize和authenticate,除此之外,在加载的时候还会对req对象定义多个方法
initialize
进行相关初始化工作,将session中的passport对象(req.session[passport._key])挂载到req._passport上,如果session中没有保存相关信息或者session为空,则req_passport={}
authenticate
给验证策略添加了额外的处理方法,如:success、fail、redirect、pass、error,主要目的是对验证状态进行保存。有了这些方法,我们就可以只关心验证逻辑的定义,在验证成功或失败后只需调用这些预先定好的方法即可。该中间件对请求按照指定的策略进行验证,如果验证通过,调用success方法,用户就会登录成功,相关用户信息将被挂载到req.user上同时会生成一个session对象,如果验证失败,将会向客户端发送未授权响应。
该中间件需要注意的地方就是验证回调,如果提供了回调函数,那么将会覆盖默认的处理方式,即:attemp方法,此时需要自行调用req.login
//提供了回调函数的情况
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
passport源码研究的更多相关文章
- OAuth2学习及DotNetOpenAuth部分源码研究
OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...
- Android开源项目 Universal imageloader 源码研究之Lru算法
https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...
- zepto源码研究 - zepto.js - 1
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
- dubbo源码研究(一)
1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...
- 【JavaScript】$.extend使用心得及源码研究
最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. ...
- underscore.js源码研究(8)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(7)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(5)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
随机推荐
- .Net多线程编程—System.Threading.Tasks.Parallel
System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...
- Could not create SSL connection through proxy serve-svn
RA layer request failedsvn: Unable to connect to a repository at URL xxxxxx 最后:Could not create SSL ...
- Android学习路线总结,绝对干货
title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- C# 数组的交集、差集、并集
C# 数组的交集.差集.并集 工作中经常会用这方面的知识来检查那些字段是必须输入的,那些是禁止输入. using System; using System.Collections.Generic; u ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- JAVA面试题
在这里我将收录我面试过程中遇到的一些好玩的面试题目 第一个面试题:ABC问题,有三个线程,工作的内容分别是打印出"A""B""C",需要做的 ...
- springmvc+bootstrap+jquerymobile完整搭建案例(提供下载地址)
用一张简单的截图说明下,然后提供一个下载地址. bootstrap的大部分样式官方都是写好的,所以只需要class="官方样式即可",具体可以看官方的案例,下面来个地址 http: ...
- 敏捷转型历程 - Sprint3 Grooming
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- MMORPG大型游戏设计与开发(攻击区域 扇形)
距离上次发布已经有了很长一段时间,期间由于各种原因没有更新这方面的技术分享,在这里深表遗憾.在MMO或其他的游戏中,会有针对各种形状的计算,通常在攻击区域里不会很复杂,常见的为矩形.圆形.扇形.今天分 ...