[转] 用WWW-Authenticate实现登录验证

用WWW-Authenticate实现登录验证

文章来源:http://www.keakon.cn/bbs/thread-1989-1-1.html
今天在研究HTTP协议时发现一个叫WWW-Authenticate的头字段,可以用于实现登录验证。它是在 RFC 2617中定义的。

用法很简单,将状态码设为401,在响应头中加上这个字段即可:
引用:
WWW-Authenticate: Basic realm="testrealm@keakon.cn"
浏览器接收到这个响应后,就会弹出这样的对话框:
用WWW-Authenticate实现登录验证 - keakon的blog -

然后用户输入用户名和密码,点确定进行登录。
此时用户名和密码会以冒号:分隔,并进行base64编码,在请求头中以Authorization字段发出:
引用:
Authorization: Basic base64编码过的登录信息
服务器只要获取Authorization字段,按base64解码,再以冒号区分用户名和密码,即可验证是否正确了。由于用户名一般不允许包含冒号,所以即使密码中输入了冒号也没关系。

一个简单的实现如下:
The py code:
  1. def get(self):   
  2.     authorization = self.request.headers.get('Authorization''')   
  3.     if authorization and authorization[:6] == 'Basic ':   
  4.         user, password = b64decode(authorization[6:]).split(':'1)   
  5.         if user == 'admin' and password == 'fuckgfw':   
  6.             self.echo('hello, ' + user)   
  7.             return  
  8.   
  9.     self.set_status(401)   
  10.     self.header['WWW-Authenticate'] = 'Basic realm="testrealm@keakon.cn"'  

当然,如果你直接这么实现的话,你的用户就惨了。因为HTTP协议是不安全的,任何窃听者都能获取Authorization字段,然后就能很轻易地获取密码了,所以这种简单的实现只能用于HTTPS。

为了确保用户的密码不被窃取,用户的登录信息应该被加密。而实际上并不需要完整的登录信息,只要一个可用于验证的摘要即可,于是服务器可以指定浏览器生成一个Digest。
所需的参数很多,有服务器生成的每次均唯一的字符串、用户请求的URI、请求序列号等。浏览器根据这些参数,与用户名、密码的MD5值用冒号组合起来,再求一次MD5,作为整个的摘要。
这样就非常安全了,只是对服务器负担较大,因为要生成一个随机字符串,还得记录请求序列号等。
好在有些库已经提供了这些功能,所以可以直接使用现成的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值