python http 身份认证简介

2023-05-16

目录

授权方式简介

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


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python http 身份认证简介 的相关文章

随机推荐

  • 学习open62541 --- [69] Client监测多个变量值

    有读者问Client如何监测多个变量值 xff0c 这篇文章给了提示 xff0c 但是没给例子 xff0c 本文给出详细例子 xff0c 使用的open62541版本是1 3 3 xff0c 运行环境debian10 5 一 准备Serve
  • 学习CANopen --- [6] 自定义对象字典

    在前面几篇文章中 xff0c 我们运行例子时都需要一个eds文件 xff0c 比较麻烦 xff0c 本文讲述如何在代码中自定义对象字典 xff0c 只添加自己需要的OD项 如果是作为master来使用 xff0c 还是比较方便的 自定义对象
  • 学习CANopen --- [7] 使用块(Block)下载

    对于一次传输超过4字节的情形 xff0c SDO可以使用Segment传输或者Block传输 xff0c Segment传输在第6篇文章中已经介绍 xff0c 本文讲解Block传输中的下载情况 一 与Segment传输的比较 相比于Seg
  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习CANopen --- [8] 多主机同时运行时的问题

    本文记录一下实际使用CANopen时开启多个主机遇到的问题 一 问题描述 本人在嵌入式设备上用Python CANopen库写一个SDO xff0c 由于数据比较多 xff0c 就使用了Segment download xff0c 大概需要
  • 学习CANopen --- [9] CAN总线的状态检查

    本文讲述如何判断CAN总线是否存在以及是否bus off xff0c 以vcan0进行讲解 xff0c vcan0是虚拟的CAN接口 xff0c 可以把它看做一个软件CAN适配器 xff08 区别于硬件CAN适配器 xff0c 如PeakC
  • 学习CANopen --- [10] 汽车外接OBD模块原理

    在某宝上搜索汽车OBD xff0c 可以发现很多卖OBD模块的 xff0c 通过接入OBD模块可以增加车子本身没有的功能 xff0c 如锁车升窗 xff0c 行车自动落锁和后视镜折叠等 xff0c 那么其实现原理是什么呢 xff1f 使用时
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip
  • 启明欣欣STM32开发板闪烁LED实验

    最近在咸鱼上买了一块启明欣欣的STM32板子 xff0c 准备在上面测试open62541和CANopen xff0c 到货后如下图 xff0c 找商家要了资料 xff0c 然后运行一个LED灯的实验来简单测试下板子 xff0c 本文记录一
  • Python fpdf2生成表格

    fpdf2库可以用来生成pdf文档 xff0c 该库是从fpdf库fork来的 xff0c 老库自2018年就不再更新维护了 xff0c fpdf2对用户更友好 xff0c api也更方便使用 一 fpdf2介绍 其网址是https pyf
  • Android动态分析工具-Inspeckage

    1 Inspeckage简介 Inspeckage是一个用来动态分析安卓app的xposed模块 Inspeckage对动态分析很多常用的功能进行了汇总并且内建一个webserver 整个分析操作可以在友好的界面环境中进行 2 下载地址 I
  • 行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

    根据BehaviorTree CPP的官方介绍 xff0c 3 x版本已经不再维护了 xff0c 建议使用4 x版本 xff0c 4 x版本和3 x版本的区别可以看这里 https www behaviortree dev migratio
  • OPC UA性能评估

    本文是对这篇论文的总结 xff0c 该文章从性能和资源使用方面比较了工业4 0的4个主要协议 xff1a OPC UA xff0c DDS xff0c ROS和MQTT 这4个协议都是基于以太网 xff08 Ethernet based x
  • 学习open62541 --- [73] 数据源造成无法监测变量的问题解决

    本人最近遇到一个问题 xff1a 给一个变量添加数据源后 xff0c 使用监测项去监测变量变化 xff0c 如果采样时间为0 xff0c 会发现无法监测到变量的变化 本文讲述这种情况的发生原因以及解决办法 一 Server例子 首先准备se
  • 启明欣欣STM32开发板移植FreeRTOS

    承接这篇文章 xff0c 本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里 xff0c 比较简单 xff0c 网上也有各种教程 xff0c 本文也是参考其它文章 xff0c 这里再记录一下 一 搭建基础工程 启明欣欣STM32
  • 学习open62541 --- [74] 软链接的妙用

    一 原理 在同一台电脑里 xff0c 可能会有多个工程同时用到open62541 xff0c 比较简单的办法是每个工程都拷贝一份open62541源码 xff0c 但是这样会造成空间浪费 xff0c 而且open62541的源码包本身也不小
  • 学习open62541 --- [75] 生成namespace文件的简便方法

    在之前的文章中 xff0c 生成namespace文件是使用open62541提供的nodeset compiler py xff0c 根据nodeset compiler rst xff08 位于open62541 doc xff09 里
  • 启明欣欣STM32开发板 --- 运行LWIP (无RTOS)

    最近体验了一下CubeMX xff0c 发现真的是非常好用 xff0c 里面使用了ST自家的HAL库 xff0c 这应该是ST的策略 xff0c 为了绑定客户 本文讲述使用CubeMX生成LWIP的Keil工程并在启明欣欣板子上运行 xff
  • 启明欣欣STM32开发板 --- 运行LWIP (使用FreeRtos)

    在上篇文章中 xff0c 我们生成了不带RTOS的LWIP工程 xff0c 本篇讲述如何生成带RTOS的LWIP工程 xff0c RTOS选择FreeRtos xff0c CubeMX工程以上篇文章中的工程为基础 文章目录 一 使能Free
  • python http 身份认证简介

    目录 授权方式简介 1 Basic Authentication 2 OAuth 3 Token Authentication 4 Digest Authentication xff08 重点说一下 xff09 代码实现 1 基本身份认证