微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python http 身份认证简介

目录

授权方式简介

1. Basic Authentication

2. OAuth

3. Token Authentication

4. Digest Authentication(重点说一下)

代码实现

1. 基本身份认证

2. 摘要式身份认证

3. OAuth 1 认证

4. OAuth 2 与 OpenID 连接认证

5. 新的身份认证形式

参考


在编写一个脚本的时候,在接口授权这个地方卡住了,平常做过Basic形式的Authorization,这次用次方式并行不通,用fiddler抓包发现是Digest。和同事的一番努力,查了Auth的几种方式怎么实现的,最终用的还是requests.auth,发现这个真的很简单。

授权方式简介

authentication 一般包含两个步骤,第一步,用户需要安装服务提供的授权证书,或者用户需要使用API服务中已经存储的某个账户,也可以创建一个;第二步,每次发送请求到API服务时需要带上证书,因为RESTful API 是不会记录客户端与服务端的会话,无状态限制。

1. Basic Authentication

用户名与密码进行Base64转码,但这种转码是可逆的。某些爬虫工具可能会获取这些请求信息,直接获取用户的账号和密码,如果采用HTTPS方式发送请求,每次请求和响应会被SSL加密,爬虫无法获取这些信息。另一个问题,由于API通常不能信任用户使用的客户端,如果用户在多个设备(平板、电脑、手机)中登录了这个API服务,其中一个设备出现安全问题,需要修改密码,那么其他设备也需要重新登录才行。为了解决第二个问题,需要对每个设备给予不同的证书。

2. OAuth

OAuth 是一种授权框架,能够让应用通过HTTP 服务获取有限的访问,访问用户账号信息,例如Facebook,GitHub,DigitalOcean都采用该技术。它可以委托认证服务授权第三方应用访问自己的账号信息。OAuth2 相比OAuth 1,可以在PC端、移动端设备上使用。

3. Token Authentication

JWT( JSON Web Token),是一种以Base64编码json对象的token,加密,紧凑且自成一体(self-contained),用于在网络中两个节点之间传递信息。
JWT由三个部分组成:
1.Header, 定义加密算法类型、定义类型(JWT)
2.Payload, 定义token携带的主要信息
3.Signature, 创建token的签名

4. Digest Authentication(重点说一下)

认证过程有两次请求-响应交互:第一次为摘要质询,服务器返回WWW-Authenticate消息头,请求终端做消息摘要。第二次交互中,客户端在HTTP请求里带有Authorization消息头,包含摘要信息和其他参数,服务器收到后做客户端鉴权,在鉴权成功后送回响应,并带有Authentication-Info消息头。客户端根据该消息头中的参数进行服务器鉴权。

1.客户端希望取到服务器上的某个资源,向服务器发送Get请求。
2.服务器收到客户端的请求后,发现这个资源需要认证信息,判断请求报文中是否带有Authorization头,如果没有,返回一个401(Unauthorized)给客户端。在这个401的回复中,同时服务器会加入一个WWW-Authenticate的头
3.客户端收到服务器的401(Unauthorized)回复后,使用服务器回复报文中的nonce值,加上username,password,http method,http uri利用MD5(或者服务器指定的其他算法)计算出request-digest,作为repsonse头域的值。并重新发送请求,请求报文中包含Authorization 头
4.服务器收到客户端发来的请求后,根据username,查找出用户的password,用和客户端同样的方法计算出request-digest(response)。然后和收到的request-digest进行对比,如果一致,则验证成功,接受客户端的请求,成功返回结果。并带有Authentication-Info消息头。客户端根据该消息头中的参数进行服务器鉴权。


代码实现

1. 基本身份认证

以 HTTP Basic Auth 发送请求非常简单:

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

2. 摘要式身份认证

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

>>> from requests.auth import HTTPDigestAuth
>>> url = 'http://httpbin.org/digest-auth/auth/user/pass'
>>> requests.get(url,auth=HTTPDigestAuth('user','pass'))
<Response [200]>

3. OAuth 1 认证

Oauth 是一种常见的 Web API 认证方式。 requests-oauthlib 库可以让 Requests 用户简单地创建 OAuth 认证的请求:

>>> import requests
>>> from requests_oauthlib import OAuth1
>>> url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
>>> auth = OAuth1('YOUR_APP_KEY','YOUR_APP_SECRET',...               'USER_OAUTH_TOKEN','USER_OAUTH_TOKEN_SECRET')
>>> requests.get(url,auth=auth)
<Response [200]>

4. OAuth 2 与 OpenID 连接认证

requests-oauthlib 库还可以处理 OAuth 2,OAuth 2 是 OpenID 连接的基础机制。 请查看 requests-oauthlib OAuth2 documentation 文档以了解 OAuth 2 的各种认证管理流程

5. 新的身份认证形式

如果你找不到所需要的身份认证形式的一个良好实现,你也可以自己实现它。Requests 非常易于添加你自己的身份认证形式。
要想自己实现,就从 AuthBase 继承一个子类,并实现 __call__() 方法

>>> import requests
>>> class MyAuth(requests.auth.AuthBase):
...     def __call__(self,r):
...         # Implement my authentication
...         return r
...
>>> url = 'http://httpbin.org/get'
>>> requests.get(url,auth=MyAuth())
<Response [200]>

参考

看到这儿,碰到的auth基本已经没问题了,至于深入,请参考如下:
Http Digest 认证
4种认证(authentication)或授权(authorization)方式
Python官方文档:
http://docs.python-requests.org/zh_CN/latest/user/authentication.html


 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐