Basic认证

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情况下使用。也可加入服务器端随机数来保护认证过程

参考文献:

推荐阅读更多精彩内容