HTTP 基本访问认证

在 HTTP 传输上下文中,基本访问认证是一种 Web 浏览器或其它客户端程序在请求中提供用户名和密码的方法。

在请求消息传输开始之前,密码被追加到用户名之后,以冒号间隔,再通过 Base64 算法编码。例如,用户名为 ‘Aladdin’ 和密码为 ‘open sesame’,得到字符串 ‘Aladdin:open sesame’ 再使用 Base64 编码,结果为 ‘QWxhZGRpbjpvcGVuIHNlc2FtZQ==’。经过 Base64 编码的字符串将被包含在 HTTP 请求消息头中传输给接收方,结果是冒号分隔的用户名和密码。

使用 Base64 算法加密用户名和密码为不可读状态,不能保证数据的安全性,仅仅可以保证传输数据是 HTTP 协议的兼容字符。

HTTP 基本访问认证规范于 1996 年定义在 RFC 1945 (Hypertext Transfer Protocol – HTTP/1.0)中。后续包含安全相关的规范在 RFC 2616 (Hypertext Transfer Protocol – HTTP/1.1) 和 RFC 2617 (HTTP Authentication: Basic and Digest Access Authentication)中被定义。

HTTP/1.1 协议同时支持 基本访问认证 和 数字访问认证。

示例
HTTP 客户端和 HTTP 服务器进行一次 基本访问认证 的典型步骤如下:

  • 客户端发起一个页面(需要认证的)请求时并无提供用户名和密码信息。(通常因为用户直接在地址栏中输入链接)
  • 服务器回应响应码为 401(”Unauthorized”)的消息,包含需要 scheme 和 realm。
  • 此刻,客户端会以提示消息的形式显示服务器发送过来的 realm,并要求用户输入用户名和密码并继续,也可取消停止。
  • 当客户端获得了用户输入的用户名和密码后,将 base64encode(username+”:”+password) 加入到之前的请求消息头中再次发送。
  • 在这个例子中,当服务端认证用户名和密码有效时,请求的页面将会返回;否则将返回响应码为 401 的页面,要求用户重要进行认证。

提示:客户端可在首次请求中携带认证信息,可直接跳过交互过程。

客户端请求(不包含认证信息)

GET /private/index.html HTTP/1.1
Host: localhost

服务器响应

HTTP/1.1 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
  <HEAD>
    <TITLE>Error</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
  </HEAD>
  <BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>

客户端请求(包含认证信息,用户名 “Aladdin”, 密码 “open sesame”)

GET /private/index.html HTTP/1.1
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

服务器响应消息

HTTP/1.1 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

引用
http://en.wikipedia.org/wiki/Basic_access_authentication

Over!

LNMP 方案之使用 HevSCGIServer CGI 模块连接 Nginx 和 PHP-CGI

HevSCGIServer CGI 模块可用于实现 SCGI 协议转 CGI 协议,执行 CGI 程序。它将通过创建子进程的方式执行 CGI 程序,在进程间通信方式上是将 socket 映射到 standard i/o,有着比较优秀的性能,同时对内存需求也比较小,适合虚拟主机方案使用。

目录结构配置可参考: LNMP 多用户动态进程管理虚拟主机方案

Nginx 配置文件

# vhost
# Heiher <admin@heiher.info>
 
# HTTP Server
server {
 
	listen   80; ## listen for ipv4
 
	server_name  localhost;
 
	access_log  /var/web/USERNAME/home/web/logs/access.log;
	error_log  /var/web/USERNAME/home/web/logs/error.log;
 
	location / {
		root   /var/web/USERNAME/home/web/www;
		index  index.html index.htm index.php;
		## Rewrite
		if (!-e $request_filename)
		{
			rewrite ^(.+)$ /index.php?q=$1 last;
		}
		omallow USERNAME sftp; # 允许访问隶属于 USERNAME:sftp 的文件
		omdeny all;            # 禁止访问其它所有文件
	}
 
	# pass the PHP scripts to FastCGI server listening on socket file
	#
	location ~ \.php$ {
		if (!-e $request_filename) {
			return 404;
		}
                scgi_pass   unix:/var/web/USERNAME/run/hev-scgi-server.sock;
                scgi_param  REDIRECT_STATUS 200;
                scgi_param  SCRIPT_FILE /usr/bin/php-cgi;
                scgi_param  SCRIPT_FILENAME /var/web/USERNAME/home/web/www/$document_uri;
                include     scgi_params;
	}
 
	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	location ~ /\.ht {
		deny  all;
	}
}
 
# HTTPS Server
server {
 
	listen   443; ## listen for ipv4
 
	server_name  localhost;
 
	ssl  on;
	ssl_certificate  /var/web/USERNAME/cert/cert.pem;
	ssl_certificate_key  /var/web/USERNAME/cert/cert.key;
 
	ssl_session_timeout  5m;
 
	ssl_protocols  SSLv3 TLSv1;
	ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
	ssl_prefer_server_ciphers   on;
 
	access_log  /var/web/USERNAME/home/web/logs/access.log;
	error_log  /var/web/USERNAME/home/web/logs/error.log;
 
	location / {
		root   /var/web/USERNAME/home/web/www;
		index  index.html index.htm index.php;
		## Rewrite
		if (!-e $request_filename)
		{
			rewrite ^(.+)$ /index.php?q=$1 last;
		}
		omallow USERNAME sftp;
		omdeny all;
	}
 
	# pass the PHP scripts to FastCGI server listening on socket file
	#
	location ~ \.php$ {
		if (!-e $request_filename) {
			return 404;
		}
                scgi_pass   unix:/var/web/USERNAME/run/hev-scgi-server.sock;
                scgi_param  REDIRECT_STATUS 200;
                scgi_param  SCRIPT_FILE /usr/bin/php-cgi;
                scgi_param  SCRIPT_FILENAME /var/web/USERNAME/home/web/www/$document_uri;
		scgi_param  HTTPS on;
                include     scgi_params;
	}
 
	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	location ~ /\.ht {
		deny  all;
	}
}

HevSCGIServer 编译安装
1. 下载源代码

mkdir hev-scgi-server-framework
cd hev-scgi-server-framework
git clone git://gitcafe.com/heiher/hev-scgi-server-library.git
git clone git://gitcafe.com/heiher/hev-scgi-server.git
git clone git://gitcafe.com/heiher/hev-scgi-server-cgi.git

2. 编译

cd hev-scgi-server-library
make
cd ..
 
cd hev-scgi-server
make
cd ..
 
cd hev-scgi-server-cgi
make
cd ..

3. 安装

mkdir -p /opt/hev-scgi-server/{bin,conf,modules}
cp hev-scgi-server/bin/* hev-scgi-server-library/bin/* /opt/hev-scgi-server/bin/
cp hev-scgi-server-cgi/bin/* /opt/hev-scgi-server/modules/
cp hev-scgi-server/conf/main.conf /opt/hev-scgi-server/conf/

HevSCGIServer 配置
conf/main.conf

[Server]
Address=unix:/var/web/USERNAME/run/hev-scgi-server.sock
ModuleDirPath=./modules

conf/modules.conf

[Module0]
Alias=HevSCGIHandlerPHP
Pattern=.*
FileName=libhev-scgi-server-cgi.so
CGIBinPath=/usr/bin/php-cgi
WorkDir=/var/web/USERNAME/home/web/www

/etc/rc.local

# HevSCGIServer
cd /opt/hev-scgi-server/
rm -f /var/web/USERNAME/run/hev-scgi-server.sock
LD_LIBRARY_PATH=/opt/hev-scgi-server/bin /opt/hev-scgi-server/bin/hev-scgi-server -u USERNAME -g GROUP
chmod 0666 /var/web/USERNAME/run/hev-scgi-server.sock

Over!

HevSCGIServer – 一个使用 GLib 实现的 SCGI 服务端框架

一个使用 GLib 实现的 SCGI 服务端框架,可通过模块实现 Handler 扩展功能。

服务器:http://gitcafe.com/heiher/hev-scgi-server
核心库:http://gitcafe.com/heiher/hev-scgi-server-library
Handler 模块实例:http://gitcafe.com/heiher/hev-scgi-server-hello
Handler CGI 模块:http://gitcafe.com/heiher/hev-scgi-server-cgi

Over!