Basic认证是客户端与服务器进行请求时,允许通过用户名和密码实现的一种身份认证方式
如果一个页面需要Basic认证,它会检查请求报文头中的Authorization字段的内容,该字段的值由认证方式和加密值构成,如下所示:
>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');
};
如果用户首次访问该网页,URL地址中也没携带认证内容,那么浏览器会响应一个401未授权的状态码,如下所示:
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状态码之后,浏览器会保存用户名和密码口令,在后续的请求中都携带上Authorization信息。
虽然经过Base64加密后在网络中传送,但是这几乎是明文,十分危险,一般只有在HTTPS情况下使用。也可加入服务器端随机数来保护认证过程
参考文献:
网友评论