HTTP 协议提供了一系列认证功能,这些功能只要在 HTTP Web Server 上配置即可,比较便捷。
Basic Auth
一、简介
在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
优点
基本认证的一个优点是基本上所有流行的网页浏览器都支持基本认证。基本认证很少在可公开访问的互联网网站上使用,有时候会在小的私有系统中使用(如路由器网页管理接口)。后来的机制HTTP摘要认证是为替代基本认证而开发的,允许密钥以相对安全的方式在不安全的通道上传输。
程序员和系统管理员有时会在可信网络环境中使用基本认证,使用Telnet或其他明文网络协议工具手动地测试Web服务器。这是一个麻烦的过程,但是网络上传输的内容是人可读的,以便进行诊断。
缺点
虽然基本认证非常容易实现,但该方案创建在以下的假设的基础上,即:客户端和服务器主机之间的连接是安全可信的。特别是,如果没有使用SSL/TLS这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截。该方案也同样没有对服务器返回的信息提供保护。
现存的浏览器保存认证信息直到标签页或浏览器被关闭,或者用户清除历史记录。HTTP没有为服务器提供一种方法指示客户端丢弃这些被缓存的密钥。这意味着服务器端在用户不关闭浏览器的情况下,并没有一种有效的方法来让用户注销。
二、访问形式
1、使用浏览器
在使用浏览器访问设置了 HTTP Basic Auth 的服务器时,会弹出对话框,输入用户名和密码即可。
2、使用 HTTP Client 工具
1 http://user:passwd@xxx.com
3、使用curl命令
1 curl -u user:passwd http://xxx.com
4、使用postman工具
三、原理
这一个典型的HTTP客户端和HTTP服务器的对话,服务器安装在同一台计算机上(localhost),包含以下步骤:
- 客户端请求一个需要身份认证的页面,但是没有提供用户名和口令。这通常是用户在地址栏输入一个URL,或是打开了一个指向该页面的链接。
- 服务端响应一个401应答码,并提供一个认证域。
- 接到应答后,客户端显示该认证域(通常是所访问的计算机或系统的描述)给用户并提示输入用户名和口令。此时用户可以选择确定或取消。
- 用户输入了用户名和口令后,客户端软件会在原先的请求上增加认证消息头,然后重新发送再次尝试。
其名称与值的形式是这样的:
1 Authorization: Basic base64encode(username+":"+password)
- 在本例中,服务器接受了该认证屏幕并返回了页面。如果用户凭据非法或无效,服务器可能再次返回401应答码,客户端可以再次提示用户输入口令。
注意:客户端有可能不需要用户交互,在第一次请求中就发送认证消息头。
客户端请求(没有认证信息):
1 GET /private/index.html HTTP/1.0 2 Host: localhost
服务端应答:
1 HTTP/1.0 401 Authorization Required 2 Server: HTTPd/1.0 3 Date: Sat, 27 Nov 2004 10:18:15 GMT 4 WWW-Authenticate: Basic realm="Secure Area" 5 Content-Type: text/html 6 Content-Length: 311 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 9 "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> 10 <HTML> 11 <HEAD> 12 <TITLE>Error</TITLE> 13 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> 14 </HEAD> 15 <BODY><H1>401 Unauthorized.</H1></BODY> 16 </HTML>
说明:Response 中的 WWW-Authenticate
字段会指示浏览器弹出询问用户名和密码的提示框。
1 WWW-Authenticate: Basic realm="Secure Area"
客户端的请求(用户名:admin,口令:123456):
1 GET /private/index.html HTTP/1.0 2 Host: localhost 3 Authorization: Basic YWRtaW46MTIzNDU2
说明:base64encode(admin:123456)=YWRtaW46MTIzNDU2