接口自动化测试-鉴权/授权/认证

前言

对于绝大多数成熟的系统来说,鉴权是非常普遍且重要的一个内容,通俗一点的理解就是登陆账号,通过登陆建立与服务器的“信任”,然后就可以赋予客户端操作的权限。这里推荐大家一个“玩”接口学习的网站 “http://httpbin.org”,里面包含了各种类型的接口形式,例如简单的post,get,delete,put请求类型,cookie使用,鉴权等。
接口自动化测试-鉴权/授权/认证_第1张图片

HTTP认证分类

1、基本验证 Basic Authentication
2、摘要验证 Digest Authentication
3、授权验证 Oauth Authentication
4、证书验证

ssl证书验证
客户端证书验证

5、自定义身份验证

基本验证 Basic Authentication

输入的用户名和密码会按照username:password的格式拼接后用base64编码,填入请求报文头部的Authorization域,如Basic bWFyczpsb28=。如果输入的是错误的用户名和密码,服务器会反复要求输入用户名及密码,直至正确或用户点击取消按钮放弃认证。如果输入的是正确的用户名及密码,浏览器返回认证通过后的页面。
由于base64编码本身是可逆的过程,所以如果有中间人截获报文后,通过重放攻击即可获取正确授权。基本认证这种方式适合于弱认证要求的场景:
接口自动化测试-鉴权/授权/认证_第2张图片
这里在网页输入账号和密码 “user”和“passwd”,回车之后打开的页面显示授权成功,账号名为“user”如下图所示
接口自动化测试-鉴权/授权/认证_第3张图片
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)

控制台返回与网页的表现一致,说明我们的请求授权成功
接口自动化测试-鉴权/授权/认证_第4张图片

方式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,接口返回信息如下
接口自动化测试-鉴权/授权/认证_第5张图片

授权验证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表单验证,大家可以过去学习一下。

你可能感兴趣的:(Requests)