Express基本原理一文中提到拇涤,Express的核心是中間件瘤袖,一切功能都是由中間件完成的掉缺。一個http請求從創(chuàng)建到結束卜录,會按順序經(jīng)過一系列中間件,一個中間件既可以修改req對象并通過調用next()
將控制權交給下一個中間件眶明,也可以直接結束http請求艰毒。
Express順序執(zhí)行中間件這個特性決定了要實現(xiàn)身份驗證非常簡單,只需要讓需要驗證的請求先經(jīng)過身份驗證中間件搜囱,在身份驗證中間件中驗證用戶身份丑瞧,如果通過驗證則繼續(xù)調用后續(xù)實際處理請求的中間件,如果沒通過驗證則返回401等錯誤響應并終止請求蜀肘。
先來自己實現(xiàn)一個簡單的身份驗證中間件來深刻理解身份驗證中間件的原理绊汹,功能非常簡單,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對象上荒叼,以后執(zhí)行的中間件可以讀取。
return next()
}
return res.sendStatus(401);
}
app.get('/', testAuthMiddleware, function (req, res) {
res.send(`Hello, ${req.user}!`)
})//演示如何使用中間件典鸡,從第二個參數(shù)開始全部是中間件被廓,這些中間件順序執(zhí)行。
//首先執(zhí)行的就是我們剛才自定義的中間件萝玷,這個中間件如果通過了身份驗證嫁乘,下一個中間件就會執(zhí)行,如果沒通過球碉,調用res.sendStatus(401)返回錯誤并終止http請求蜓斧,后面的中間件不會被調用。
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
當然我們自己實現(xiàn)的這個中間件只是一個玩具睁冬,要在基于Express的web應用中使用身份驗證機制挎春,passport中間件幾乎是不二之選。下一篇文章將詳細介紹passport的原理與用法豆拨。