django

[接口测试_B] 11 requests的身份认证方式

2018-04-23  本文已影响319人  乐大爷L

requests提供多种身份认证方式,包括基本身份认证、netrc 认证、摘要式身份认证、OAuth 1 认证、OAuth 2 与 OpenID 连接认证、自定义认证。这些认证方式的应用场景是什么呢?

身份认证的定义

身份认证是使用用户提供的凭证来识别用户。

身份认证的类型

1、基本身份认证

# 响应头
WWW-Authenticate: Basic realm="***"
>>> from requests.auth import HTTPBasicAuth
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user1', 'pass1'), verify=False)
>>> r.headers
{'Date': 'Sun, 22 Apr 2018 13:01:47 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Server': 'GitHub.com', 'Status': '401 Unauthorized', 'X-GitHub-Media-Type': 'github.v3; format=json', 'X-RateLimit-Limit': '60', 'X-RateLimit-Remaining': '55', 'X-RateLimit-Reset': '1524405461', 'Access-Control-Expose-Headers': 'ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval', 'Access-Control-Allow-Origin': '*', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains; preload', 'X-Frame-Options': 'deny', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Referrer-Policy': 'origin-when-cross-origin, strict-origin-when-cross-origin', 'Content-Security-Policy': "default-src 'none'", 'X-Runtime-rack': '0.047109', 'X-GitHub-Request-Id': '6515:2E0E:7D2DCF:AAC671:5ADC87BB', 'Content-Length': '83'}
>>> r.status_code
401
>>> requests.get('https://api.github.com/user', auth=('user', 'pass'), verify=False)
<Response [200]>

2、netrc 认证

3、摘要式身份认证

摘要式身份认证的步骤

参考文章:https://blog.csdn.net/jansony1/article/details/52430577

  1. 客户端访问一个受http摘要认证保护的资源。
  2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。
HTTP/1.1 401 Unauthorized 
WWW-Authenticate: Digest 
realm="testrealm@host.com", 
qop="auth,auth-int", 
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", 
opaque="5ccc069c403ebaf9f0171e9517f40e41" 
  1. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。
    认证必须的五个情报:
・ realm : 响应中包含信息 
・ nonce : 响应中包含信息 
・ username : 用户名 
・ digest-uri : 请求的URI 
・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。
Authorization: Digest 
username="Mufasa", ← 客户端已知信息 
realm="testrealm@host.com", ← 服务器端质询响应信息 
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ← 服务器端质询响应信息 
uri="/dir/index.html", ← 客户端已知信息 
qop=auth, ← 服务器端质询响应信息 
nc=00000001, ← 客户端计算出的信息 
cnonce="0a4f113b", ← 客户端计算出的客户端nonce 
response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3 
opaque="5ccc069c403ebaf9f0171e9517f40e41" ← 服务器端质询响应信息 
  1. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。
    注意事项:

    1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。
    2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。
    3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。
    4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。

    ※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。
    ※ nounce:随机字符串,每个请求都得到一个不同的nounce。
    ※ MD5(Message Digest algorithm 5,信息摘要算法)
    1)用户名:realm:密码 ⇒ ha1
    2)HTTP方法:URI ⇒ ha2
    3)ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3

requests处理摘要式认证示例

另一种非常流行的 HTTP 身份认证形式是摘要式身份认证,Requests 对它的支持也是开箱即可用的。

>>> import requests
>>> from requests.auth import HTTPDigestAuth
>>> url = 'http://httpbin.org/digest-auth/auth/user/pass'
>>> r =  requests.get(url, auth=HTTPDigestAuth('user1', 'pass1'))
>> r.headers
{'Connection': 'keep-alive', 'Server': 'meinheld/0.6.1', 'Date': 'Sun, 22 Apr 2018 14:18:45 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Www-Authenticate': 'Digest opaque="fa8967887da1e2b9194eea35cb9a3997", stale=FALSE, nonce="b60a8a793b2e456721fc8690ddacc52b", algorithm=MD5, qop="auth", realm="me@kennethreitz.com"', 'Set-Cookie': 'stale_after=never; Path=/, last_nonce=dec64716dfa7b76e7e4acbae0025e93c; Path=/, fake=fake_value; Path=/', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'X-Powered-By': 'Flask', 'X-Processed-Time': '0', 'Via': '1.1 vegur', 'Content-Length': '0'}

4、OAuth 1 认证

Oauth 是一种常见的 Web API 认证方式。 requests-oauthlib 库可以让 Requests 用户简单地创建 OAuth 认证的请求。
查看OAuth1的原理,可以查看微博的api:http://open.weibo.com/wiki/index.php/Oauth

5、OAuth 2 与 OpenID 连接认证

6、requests处理token

总结

上一篇 下一篇

猜你喜欢

热点阅读