美文网首页django测试之路
#Python#如何进行身份认证?

#Python#如何进行身份认证?

作者: 我叫GTD | 来源:发表于2018-08-26 22:26 被阅读381次

    在编写一个脚本的时候,在接口授权这个地方卡住了,平常做过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

    相关文章

      网友评论

        本文标题:#Python#如何进行身份认证?

        本文链接:https://www.haomeiwen.com/subject/doraiftx.html