Express基本原理一文中提到,Express的核心是中间件,一切功能都是由中间件完成的。一个http请求从创建到结束,会按顺序经过一系列中间件,一个中间件既可以修改req对象并通过调用next()
将控制权交给下一个中间件,也可以直接结束http请求。
Express顺序执行中间件这个特性决定了要实现身份验证非常简单,只需要让需要验证的请求先经过身份验证中间件,在身份验证中间件中验证用户身份,如果通过验证则继续调用后续实际处理请求的中间件,如果没通过验证则返回401等错误响应并终止请求。
先来自己实现一个简单的身份验证中间件来深刻理解身份验证中间件的原理,功能非常简单,http headers中包含username
并且password==='pwd'
则说明当前用户已登录,通过身份验证,并把当前用户的用户名附加到req对象上;其它情况一律认为没有通过身份验证并返回错误代码401,代码如下:
var express = require('express')
var app = express()
function testAuthMiddleware(req, res, next) {
var username = req.get('username')
if (username && 'pwd' === req.get('password')) {
req.user = username//身份验证通过,把用户信息附加到req对象上,以后执行的中间件可以读取。
return next()
}
return res.sendStatus(401);
}
app.get('/', testAuthMiddleware, function (req, res) {
res.send(`Hello, ${req.user}!`)
})//演示如何使用中间件,从第二个参数开始全部是中间件,这些中间件顺序执行。
//首先执行的就是我们刚才自定义的中间件,这个中间件如果通过了身份验证,下一个中间件就会执行,如果没通过,调用res.sendStatus(401)返回错误并终止http请求,后面的中间件不会被调用。
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
当然我们自己实现的这个中间件只是一个玩具,要在基于Express的web应用中使用身份验证机制,passport中间件几乎是不二之选。下一篇文章将详细介绍passport的原理与用法。