Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
69 lines (33 sloc) 2.7 KB

passprot

passport的作用主要是两个:

1、实现用户登录验证逻辑。

2、passport.serializeUserpassport.deserializeUser

实现用户登录逻辑

定义策略

lib/passport.js

定义local策略,其中usernamepassword是通过app.use(bodyParser.json())

app.use(bodyParser.urlencoded({ extended: false })) 这个两个中间件解析到req.body上,而passport会直接从req.body上获取参数。

当请求头中属性contentType:application/json,在app.use(bodyParser.json())解析后,请求参数会添加到req.body

当请求头中属性为Content-Type: application/x-www-form-urlencoded,

app.use(bodyParser.urlencoded({ extended: false }))解析后,也会把解析的值添加到req.body

策略初始化,加入到应用中

index.js

根据登录api,路由到相应的策略进行调用

api.js

passport.serializeUserpassport.deserializeUser

for serializeUser

1、当一个用户提交登录表单,根据路由调用到passport.authenticate中间件,因为中间件是一个函数,因此需要设置函数自执行。

2、授权中间件根据之前的配置的本地策略,调用实现的本地策略。

3、Passport从req.body.username and req.body.password获取用户名和密码,执行验证函数,具体在本地策略中实现。

4、现在我们做的事情是:根据用户名在数据库中查找用户,查完之后,匹配密码是否正确。

5、如果没问题的话,触发done(null, user)函数。

6、调用done(null, user)函数会调用passport.authenticate的回调。

7、在回调函数中调用req.login(这是一个中间件函数,绑定到请求函数中)。

8、在req.login中自动调用passport.serializeUser序列化用户保存到mongodb数据库中,同时可以选择保存整个对象还是用户Id,这里保存的是用户Id。

for deserializeUser

1、passport.initialize中间件对于每次请求都会触发,目的是确定session包含一个passport.user对象,尽管可能是空的。

2、如果序列化的用户在服务器端的数据库存在,passport.session中间件可以把数据库中的user这个对象获取赋值给req.user。而passport.session也会在每次请求时触发。

3、passport.deserializeUser这个函数由passport.session触发。在每次请求中可以加载user信息,然后把user对象attach到req.user。

注:

1、Local Strategy仅仅被在特定路由上使用passport.authenticate 被触发。

2、而仅仅passport.serializeUser函数被执行后,用户信息才会被存储到sessions中。