Basic認證是客戶端與服務器進行請求時参歹,允許通過用戶名和密碼實現(xiàn)的一種身份認證方式
如果一個頁面需要Basic認證颊咬,它會檢查請求報文頭中的Authorization字段的內(nèi)容万伤,該字段的值由認證方式和加密值構成,如下所示:
>GET/HTTP/1.1
>Authorization: Basic dXNlcjpwYXNz
>User-Agent:curl/7.24.0 (x86_ 64-apple一darwin12.0) libcurl/7.24.0 OpenSSL/0.g.8r zlib/1.2.5
>Host:www.baidu.com
>Accept:*/*
在Basic認證中月劈,它會將用戶和密碼部分組合:"username"+":"+"password"度迂。然后進行Base64編碼藤乙,如下所示:
var encode=function(username,password){
return new Buffer(username+’:’+password).toString(’base64');
};
如果用戶首次訪問該網(wǎng)頁,URL地址中也沒攜帶認證內(nèi)容惭墓,那么瀏覽器會響應一個401未授權的狀態(tài)碼坛梁,如下所示:
function (req, res){
var auth = req.headers[’authorization'] || ' ';
var parts = auth.split(' ');
var method = parts[0] ||' ';//Basic
var encoded = parts[1] ||' ';//dXNlcjpwYXNz
var decoded = new Buffer(encoded,’base64').toString(’ut仁8').split(":”);
var user = decoded[0];//user
var pass = decoded[1];//pass
if(!checkUser(user, pass)){
res.setHeader('WWW-Authenticate',’Basic realm="Secure Area"’);
res.writeHead(401);
res.end();
}else{
handle(req, res);
}
}
在上面的代碼中腊凶,響應頭中的WWW-Authenticate字段告知瀏覽器采用什么樣的認證和加密方式划咐。一般而言,未認證的情況下钧萍,瀏覽器會彈出對話框進行交互式提交認證信息.
當認證通過褐缠,服務器端響應200狀態(tài)碼之后,瀏覽器會保存用戶名和密碼口令风瘦,在后續(xù)的請求中都攜帶上Authorization信息队魏。
雖然經(jīng)過Base64加密后在網(wǎng)絡中傳送,但是這幾乎是明文万搔,十分危險胡桨,一般只有在HTTPS情況下使用。也可加入服務器端隨機數(shù)來保護認證過程
參考文獻: