前言
对于绝大多数成熟的系统来说,鉴权是非常普遍且重要的一个内容,通俗一点的理解就是登陆账号,通过登陆建立与服务器的“信任”,然后就可以赋予客户端操作的权限。这里推荐大家一个“玩”接口学习的网站 “http://httpbin.org”,里面包含了各种类型的接口形式,例如简单的post,get,delete,put请求类型,cookie使用,鉴权等。
HTTP认证分类
1、基本验证 Basic Authentication
2、摘要验证 Digest Authentication
3、授权验证 Oauth Authentication
4、证书验证ssl证书验证 客户端证书验证
5、自定义身份验证
基本验证 Basic Authentication
输入的用户名和密码会按照username:password的格式拼接后用base64编码,填入请求报文头部的Authorization域,如Basic bWFyczpsb28=。如果输入的是错误的用户名和密码,服务器会反复要求输入用户名及密码,直至正确或用户点击取消按钮放弃认证。如果输入的是正确的用户名及密码,浏览器返回认证通过后的页面。
由于base64编码本身是可逆的过程,所以如果有中间人截获报文后,通过重放攻击即可获取正确授权。基本认证这种方式适合于弱认证要求的场景:
这里在网页输入账号和密码 “user”和“passwd”,回车之后打开的页面显示授权成功,账号名为“user”如下图所示
Python里面我们使用requests模块实现这个鉴权方式,代码如下
方式1
#coding=utf-8
'''
@author=Savitar
'''
import requests
#basic auth
url = "http://httpbin.org/basic-auth/user/passwd"
r = requests.get(url,auth=('user','passwd'))
print(r.text)
控制台返回与网页的表现一致,说明我们的请求授权成功
方式2
当然我们也可以使用另外一种方式来实现Basic授权,通过导入reqests.auth模块中的HTTPBasicAuth方法,返回的结果与上面一致
#coding=utf-8
'''
@author=Savitar
'''
import requests
from requests.auth import HTTPBasicAuth
url = "http://httpbin.org/basic-auth/user/passwd"
r1 = requests.get(url,auth=HTTPBasicAuth('user','passwd'))
print(r1.text)
摘要验证Digest Authentication
浏览器收到响应后,弹出对话框要求用户输入用户名和密码。与基本认证不同在于,摘要认证不会发送原始密码,注意请求中的response字段,是通过其他字段及密码经过一系列摘要运算(md5)得到的
具体的浏览器页面与基本验证相同,并且输入正确的账号密码后,页面的文本信息也一致,我们直接上Python代码实现摘要验证
#coding=utf-8
'''
@author=Savitar
'''
import requests
from requests.auth import HTTPDigestAuth
url = "http://httpbin.org/digest-auth/auth/user/passwd/MD5/never"
r2 = requests.get(url,auth=HTTPDigestAuth('user','passwd'))
print(r2.text)
这里我们使用的方法则为HTTPDigestAuth,接口返回信息如下
授权验证Oauth Authentication
授权验证则是通过三方服务授权得到的验证,假设我们使用QQ登录我们自己的服务器,我们自己的服务器如何认为授权ok的?以博主自己的项目经验,我们的服务器向qq发起授权,用户登录qq并且在qq认证成功之后会返回一个code的值,我们拿到这个返回值之后,认为用户授权成功。
SSL验证
这种就是在我们使用https请求的时候经常遇到,但一般接口请求失败的时候,我们会使用“verify=False”来规避https请求产生的问题。以下代码我们延时verify参数的用处。
#coding=utf-8
'''
@author=Savitar
'''
import requests
url = "https://httpbin.org"
r = requests.get(url)
print(r.headers['Date'])
r1 = requests.get(url,verify=True)
print(r1.headers['Date'])
r2 = requests.get(url,verify=False)
print(r2.headers['Date'])
我们请求httpbin的首页,并打印headers中的Date数据,输出如下
C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Administrator/PycharmProjects/PythonLearn/auth.py Sun, 17 Sep 2017 13:10:21 GMT Sun, 17 Sep 2017 13:10:32 GMT C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) Sun, 17 Sep 2017 13:10:39 GMT Process finished with exit code 0
r1和r2的打印输出基本一致(获取的时间不同),而在打印r3的时候会出现提示,不安全的请求。这是因为我们访问的是https的请求,但是我们拒绝了ssl认证导致的,虽然它仍会打印出时间。
自定义身份验证
转接http://www.cnblogs.com/wangqiaomei/p/5502439.html,这篇博客主要讲述了自定义form表单验证,大家可以过去学习一下。