requests-aws4auth

requests-aws4auth

AWS身份验证Python库

requests-aws4auth是一个开源Python库,为Requests库集成AWS版本4身份验证。它支持所有使用AWS auth v4的服务,提供独立签名密钥、自动密钥重生成和STS临时凭证等功能。该库已在多个AWS服务上测试通过,兼容Python 2.7和3.5+版本,并提供简单API便于项目集成。

AWS认证PythonRequests库AWS服务STS临时凭证Github开源项目

图片 图片

为Python Requests库提供Amazon Web Services版本4认证。

特性

  • 支持所有使用AWS auth v4的AWS服务的Requests认证
  • 独立的签名密钥对象
  • 当超过作用域日期边界时自动重新生成密钥
  • 支持STS临时凭证

实现基于头部的认证,不支持GET URL参数和POST参数认证。

支持的服务

该软件包已经测试可用于以下服务:

AppStream、AppSync、Auto-Scaling、CloudFormation、CloudFront、CloudHSM、CloudSearch、CloudTrail、CloudWatch监控、CloudWatch日志、CodeDeploy、Cognito Identity、Cognito Sync、Config、DataPipeline、Direct Connect、DynamoDB、Elastic Beanstalk、ElastiCache、EC2、EC2容器服务、Elastic Load Balancing、Elastic MapReduce、ElasticSearch、Elastic Transcoder、Glacier、Identity and Access Management (IAM)、Key Management Service (KMS)、Kinesis、Lambda、Opsworks、Redshift、Relational Database Service (RDS)、Route 53、Simple Storage Service (S3)、Simple Notification Service (SNS)、Simple Queue Service (SQS)、Storage Gateway、Security Token Service (STS)

以下服务不支持AWS auth版本4,无法与此软件包一起使用:

Simple Email Service (SES)、Simple Workflow Service (SWF)、Import/Export、SimpleDB、DevPay、Mechanical Turk

AWS Support API尚未测试,因为它需要高级订阅。

Python版本

在1.x语义版本中,最低Python支持将逐步提高:

  • 1.0.x: 支持python2.7和python3.3+。
  • 1.1.x: 不支持python2.7,仅尽力而为。支持python3.3+。
  • 1.2.x: Requires-Python将设置为python3.3+,明确移除早期版本。python<3.7不受支持,仅尽力而为。
  • 1.3.x: Requires-Python将设置为python3.7+,明确移除早期版本。(尽力而为待定)

安装

通过pip安装:

$ pip install requests-aws4auth

requests-aws4auth需要Kenneth Reitz的Requests库。

requests-aws4auth在Python 2.7和3.5及以上版本上进行了测试。

0.8版本的行为变化

0.8版本引入了请求日期检查和自动密钥重新生成行为作为默认设置。这对于在线程之间共享身份验证对象以及存储密钥有影响。有关详细信息,请参阅下面的相关部分。另请参阅GitHub问题#10中的讨论。

基本用法

>>> import requests >>> from requests_aws4auth import AWS4Auth >>> endpoint = 'http://s3-eu-west-1.amazonaws.com' >>> auth = AWS4Auth('<访问ID>', '<访问密钥>', 'eu-west-1', 's3') >>> response = requests.get(endpoint, auth=auth) >>> response.text <?xml version="1.0" encoding="UTF-8"?> <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01"> <Owner> <ID>bcaf1ffd86f461ca5fb16fd081034f</ID> <DisplayName>webfile</DisplayName> ...

此示例将列出Amazon S3服务的eu-west-1区域中的存储桶。

STS临时凭证

>>> from requests_aws4auth import AWS4Auth >>> auth = AWS4Auth('<访问ID>', '<访问密钥>', 'eu-west-1', 's3', session_token='<会话令牌>') ...

此示例展示了如何构造用于STS临时凭证的AWS4Auth对象。添加了带有会话令牌的x-amz-security-token头。不管理临时凭证超时 - 如果临时凭证过期,需要重新生成并用新凭证重新构造AWS4Auth对象。

使用botocore RefreshableCredentials的动态STS凭证

>>> from requests_aws4auth import AWS4Auth >>> from botocore.session import Session >>> credentials = Session().get_credentials() >>> auth = AWS4Auth(region='eu-west-1', service='es', refreshable_credentials=credentials) ...

此示例展示了如何使用自动刷新凭证构造AWS4Auth实例,适用于使用AWS IAM assume-role的长时间运行应用程序。 RefreshableCredentials实例用于生成每个请求的有效静态凭证,无需在临时凭证过期时重新创建AWS4Auth实例。

日期处理

如果要进行身份验证的HTTP请求包含DateX-Amz-Date头,AWS只会在头中的日期与签名密钥的作用域日期匹配时接受授权请求(参见AWS REST API日期文档)。

从requests-aws4auth的0.8版本开始,如果头部日期与作用域日期不匹配,AWS4Auth实例将自动重新生成其签名密钥,使用与前一个密钥相同的作用域参数,除了日期将更改为匹配请求日期。如果请求不包含日期,则当前日期将添加到X-Amz-Date头中的请求中,如果这与作用域日期不同,则重新生成签名密钥。

这意味着AWS4Auth现在从X-Amz-DateDate头的值中提取和解析日期。支持的日期格式有:

  • RFC 7231(例如:Mon, 09 Sep 2011 23:36:00 GMT)
  • RFC 850(例如:Sunday, 06-Nov-94 08:49:37 GMT)
  • C 时间(例如:Wed Dec 4 00:00:00 2002)
  • Amz-Date 格式(例如:20090325T010101Z)
  • ISO 8601 / RFC 3339(例如:2009-03-25T10:11:12.13-01:00)

如果存在任一标头但 AWS4Auth 无法提取日期(因为所有存在的日期标头格式无法识别),AWS4Auth 将删除任何现有的 X-Amz-DateDate 标头,并替换为单个包含当前日期的 X-Amz-Date 标头。可以使用 AWS4Auth 构造函数的 raise_invalid_date 关键字参数修改此行为。

自动密钥重新生成

如果您不希望在遇到请求日期与范围日期不匹配时自动重新生成签名密钥,请使用替代的 StrictAWS4Auth 类。该类与 AWS4Auth 相同,但在遇到日期不匹配时只会引发 DateMismatchError。您也可以使用 PassiveAWS4Auth 类,它模仿 0.8 版本之前的 AWS4Auth 行为,只是签名并发送请求,无论日期是否匹配。在这种情况下,由调用代码来处理由日期不匹配导致的 AWS 身份验证失败响应。

密钥存储

为了允许自动密钥重新生成,密钥存储在 AWS4Auth 实例的签名密钥对象中。如果您不希望这样,请使用 store_secret_key 参数设置为 False 的 AWS4Signing 密钥来实例化:

>>> sig_key = AWS4SigningKey(secret_key, region, service, date, False) >>> auth = StrictAWS4Auth(access_id, sig_key)

然后,当 AWS4Auth 类尝试重新生成其密钥时,将引发 NoSecretKeyError。一种稍微更优雅的处理方式是使用替代的 StrictAWS4Auth 类,同样使用 store_secret_key = False 创建的 AWS4SigningKey 实例来实例化它。

多线程

如果您在线程之间共享 AWS4Auth(甚至 StrictAWS4Auth)实例,很可能会遇到问题。由于 AWS4Auth 实例可能会在签名请求过程中不可预测地重新生成其签名密钥,使用相同实例的线程可能会发现密钥在签名过程中被另一个线程更改,这可能导致未定义的行为。

可能可以使用锁定原语和 StrictAWS4Auth 类设置一个可行的实例共享机制,但是这位可怜的作者想不出一种既安全又不会在某个时刻阻塞所有线程至少一个 HTTP 请求持续时间的方案,这可能需要几秒钟。如果短时间内连续出现几个都需要密钥重新生成的请求,那么系统可能被迫进入串行操作相当长的时间。

简而言之,最好为每个需要进行身份验证的线程创建一个线程本地的 AWS4Auth 实例。

API 参考

请参阅 aws4auth.pyaws4signingkey.py 中的文档字符串。

测试

测试套件包含在 test 文件夹中。

该包通过了 AWS auth v4 测试套件中的所有测试,并包含针对支持的在线服务的测试。有关运行测试的详细信息,请参阅 test/requests_aws4auth_test.py 中的文档字符串。

如果您有访问权限并想尝试,测试中包含了 AWS Support API 的连接参数。文档说它支持 auth v4,所以如果您有订阅,它应该可以工作。请分享您的结果!

不支持的 AWS 功能 / 待办事项

  • 目前不支持 Amazon S3 分块上传
  • 新 AWS 服务的测试
  • 即使只使用 AWS4SigningKey 也需要 Requests 库
  • 连贯的文档

版本发布说明

  • 更新 HISTORY.md
  • 更新 requests_aws4auth/__init__.py
  • 在 GitHub 上创建一个发布

Docker 环境:

docker run -v `pwd`:/opt/app/ -v ~/.pypirc:/root/.pypirc  -it python:3.12 /bin/bash

准备工作:

python3 -m pip install --user --upgrade setuptools wheel testresources twine

构建和发布,凭据在 ~/.pypirc 中:

rm -f dist/*; \
python3 setup.py sdist bdist_wheel && \
python3 -m twine upload --repository testpypi dist/* && \
python3 -m twine upload --repository pypi dist/*

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多