首页 > 代码库 > Python的HTTP Basic认证

Python的HTTP Basic认证

 一、HTTP的Basic认证:

在HTTP协议的通信过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户的身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本的认证过程对客户端的用户名和密码进行验证,以决定用户是否合法。

客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名和密码,然后将用户名及密码用BASE64进行加密,加密后的密文将附加于请求信息中,如用户名为Paul,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并每次请求数据时,将密文附加于请求头(Request Header)中。当HTTP服务器每次收到请求包后,根据协议得客户端附加的用户信息,解开包,对用户名和密码进行验证后,如果正确,则根据用户需求,返回客户端所需要的数据;否则返回错误代码401,要求用户重新提供用户名和密码。

二、BSAIC认证过程:

1. 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:


         Get/index.html HTTP/1.0
         Host:www.baidu.com

2. 服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:


        HTTP/1.0 401 Unauthorised
        Server: SokEvo/1.0
        WWW-Authenticate: Basic realm="google.com"
        Content-Type: text/html
        Content-Length: xxx

3. 当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
 
4. 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
    
        Get /index.html HTTP/1.0
        Host:www.google.com
        Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

5. 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端。

三、BASIC认证的缺点:

HTTP基本认证的目标是提供简单的用户验证功能,起认证过程简单明了,适合于安全性要求不高的系统和设备中,如路由器的配置页面的认证,几乎都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域认证功能,另外,BASE64的加密强度非常底,可以说仅能防止sohu的搜索。当然,HTTP基本认证也可以结合SSL,实现安全性较高的认证系统。

四、Python urllib2 Basic 认证:

1. 通过添加HTTP Header来实现:

         import urllib2
         from base64 import encodestring

         url = 'http://XXX.XXX.X.XX'
         user = 'a'
         passwd = 'aa' 

         req = urllib2.Request(url)
         basestr = encodestring('%s:%s' % (user,passwd))[:-1]
         req.add_header('Authorization','Basic %s' % basestr)

         f = urllib2.urlopen(req)

2. 通过handler来实现:

       import urllib2

        url = 'http://XXX.XXX.X.XX'
        user = 'a'
        passwd = 'aa'

        hdlr = urllib2.HTTPBasicAuthHandler()
        hdlr.add_password('hello',url,user,passwd)  ##此处需添入realm
        opener = urllib2.build_opener(hdlr)
        urllib2.install_opener(opener)

        f = urllib2.urlopen(url)

    为了更通用我们来用HTTPPasswordMgrWithDefaultRealm密码管理器来实现:

        import urllib2

        url = 'http://XXX.XXX.X.XX'
        user = 'a'
        passwd = 'aa'

        psmg = urllib2.HTTPPasswordMgrWithDefaultRealm() 
        psmg.add_password(None,url,user,passwd)
        hdlr = urllib2.HTTPBasicAuthHandler(psmg)
        opener = urllib2.build_opener(hdlr)
        urllib2.install_opener(opener)

        f = urllib2.urlopen(url)

参考:
http://www.csdn123.com/html/itweb/20131011/161459.htm

http://blog.itpub.net/23071790/viewspace-709367/


Python的HTTP Basic认证