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

身份认证的定义

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

  • session会话保存,用来保持会话的状态;

  • token是对用户进行授权。

  • 身份认证和授权的关系:需要先获取身份信息才能进行授权

身份认证的类型

1、基本身份认证

  • HTTP Basic Auth是HTTP1.0提出的认证方式

  • 客户端对于每一个realm,通过提供用户名和密码来进行认证的方式

  • 当认证失败时,服务器收到客户端请求,返回401 UNAUTHORIZED,同时在HTTP响应头的WWW-Authenticate域说明认证方式及认证域

    # 响应头WWW-Authenticate: Basic realm="***"

    requests以 HTTP Basic Auth 发送请求,示例:

事实上,HTTP Basic Auth 如此常见,Requests 就提供了一种简写的使用方式(事实上,很难找到用http基本身份认证方式的网站了):

>>> requests.get('https://api.github.com/user', auth=('user', 'pass'), verify=False)
<Response [200]>

2、netrc 认证

  • 如果认证方法没有收到 auth 参数,Requests 将试图从用户的 netrc 文件中获取 URL 的 hostname 需要的认证身份

  • 如果找到了 hostname 对应的身份,就会以 HTTP Basic Auth 的形式发送请求

  • 简而言之,需要预先将认证的host及用户名、密码以明文方式存在netrc文件中,这种方式也是非常不安全的

3、摘要式身份认证

  • digest authentication:在HTTP 1.1提出,目的是替代http 1.0提出的基本认证方式

  • 服务器收到客户端请求后返回401 UNAUTHORIZED,同时在WWW-Authenticate字段说明认证方式是Digest,其他信息还有realm域信息、nonce随机字符串、opaque透传字段(客户端会原样返回)等

摘要式身份认证的步骤

参考文章: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"

客户端将以用户名,密码,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状态,要求重新进行认证。 注意事项:

    ※ 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

    1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。

    2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。

    3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。

    4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。

requests处理摘要式认证示例

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

可以看到,当认证失败,返回401时,header中包含的信息:

4、OAuth 1 认证

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

  • 要使用OAuth验证,首先需要获取到对应的access_token等信息。

  • 官方示例如下:

5、OAuth 2 与 OpenID 连接认证

  • OAuth2是OAuth1的升级版,requests-oauthlib 库还可以处理 OAuth 2,OAuth 2 是 OpenID 连接的基础机制。

6、requests处理token

  • 每次登录后,返回的token信息都是不同的,因此要再次向服务端传送token信息;

  • 以github接口为例,获得token后,查看用户拥有的权限:

总结

  • 理解基本认证方式和摘要认证方式的原理

  • OAuth认证是目前大部分api采用的认证方式

  • token是在服务器端生成的一个令牌,这个令牌有时间期限和权限,就比如皇宫大内中的不同职责的人员拿着令牌能进入的场所不同

接口测试 requests的身份认证方式的更多相关文章

  1. api接口对于客户端的身份认证方式以及安全措施

    转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...

  2. Oracle身份认证方式

    Oracle对于普通账户和超级管理员(指sysdba和sysoper)的认证机制不一样,前者是通过数据字典,后者主要是通过操作系统验证和密码文件验证.因此一般提到操作系统认证或密码文件认证,针对的都是 ...

  3. 基于http协议的api接口对于客户端的身份认证方式以及安全措施

    由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服 ...

  4. (转)基于http协议的api接口对于客户端的身份认证方式以及安全措施

    由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的 jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在 ...

  5. 使用 requests 进行身份认证

    如下图,有些网站需要使用用户名密码才可以登录,我们可以使用 requests 的 auth 参数来实现 import requests req = requests.get("http:// ...

  6. 基于前后端分离的身份认证方式——JWT

    什么是JWT JWT--Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应用授权. 现在一般都用redis来出来token做 ...

  7. requests接口测试——身份认证

    当调用者访问接口时需要进行用户认证(用户名密码的登录),只有通过了认证才允许调用者访问接口. 1.基本身份认证 许多要求身份认证的web服务都接受HTTP Basic Auth.这是最简单的一种身份认 ...

  8. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  9. .NetCore采取JWT方式进行身份认证

    验证与授权 Authentication(身份认证) 认证是系统对请求的用户进行身份识别的过程. Authorization (授权) 授权是对认证通过后的用户进行权限分配的过程.授权简单理解就是:识 ...

随机推荐

  1. SQL基础教程(第2版)第7章 集合运算:练习题

    可能有些读者会对此感到惊讶:“同时使用 UNION 和 INTERSECT 时,不是 INTERSECT 会优先执行吗?”当然,从执行顺序上来说确实是从 INTERSECT 开始的, 但是在此之前,由 ...

  2. one_day_one_linuxCmd---netstat命令

    <坚持每天学习一个 linux 命令,今天我们来学习 netstat 命令> 前言:netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等,还可以很方便查看本地机器上 ...

  3. 第二季 第四天 part2

    数据类型的转换 转化为字符串 String(value) 转型函数 这个转型函数能把任何类型的值转化为字符串 如果值有toString()方法 则用这个方法(调用没有参数的toString,默认十进制 ...

  4. 35. docker swarm dockerStack 部署 投票应用

    1. 编写 docker-compose.yml # docker-compose.yml version: "3" services: redis: image: redis:a ...

  5. IPC---有名管道FIFO

    一.参考网址 1.Linux学习之——FIFO实例

  6. Java8之深入理解Lambda

    lambda表达式实战 从例子引出lambda 传递Runnable创建Thread java8之前 Thread thread=new Thread(new Runnable() { @Overri ...

  7. docker---设置镜像加速器

    国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器,国内很多云服务商都提供了国内加速器服务,如: Azure 中国镜像: https://dockerhub.azk8s.cn ...

  8. MySQL学习笔记——〇三 MySQL习题

    在前面讲了MySQL的初步使用方法以后,在这里放出来一些案例来看看怎么做. 先看看database的结构,一共5个表 外键关系: class的cid是student的class_id的外键,teach ...

  9. Linux中的错误重定向你真的懂吗

    在很多定时任务里.shell里我们往往能看到 "2>&1",却不知道这背后的原理. 举个例子: * 1 * * * test.sh > /dev/null 2& ...

  10. gff文件提取cds

    #!/usr/bin/perl use strict; use warnings; ########input######## ];my $cut = &cut($gff);my %cut = ...