跳转到主要内容

Requests的AWS4身份验证

项目描述

https://img.shields.io/pypi/v/requests-aws4auth.svg https://img.shields.io/pypi/l/requests-aws4auth.svg

为Python Requests 库提供Amazon Web Services版本4身份验证。

特性

  • 为所有支持AWS身份验证v4的AWS服务提供Requests身份验证

  • 独立的签名密钥对象

  • 当作用域日期边界通过时自动生成密钥

  • 支持STS临时凭证

实现基于头的身份验证,不支持GET URL参数和POST参数身份验证。

支持的服务

此软件包已测试可与之协同工作

AppStream、Auto-Scaling、CloudFormation、CloudFront、CloudHSM、CloudSearch、CloudTrail、CloudWatch Monitoring、CloudWatch Logs、CodeDeploy、Cognito Identity、Cognito Sync、Config、DataPipeline、Direct Connect、DynamoDB、Elastic Beanstalk、ElastiCache、EC2、EC2 Container Service、Elastic Load Balancing、Elastic MapReduce、ElasticSearch、Elastic Transcoder、Glacier、身份和访问管理(IAM)、密钥管理服务(KMS)、Kinesis、Lambda、Opsworks、Redshift、关系数据库服务(RDS)、Route 53、简单存储服务(S3)、简单通知服务(SNS)、简单队列服务(SQS)、存储网关、安全令牌服务(STS)

以下服务不支持AWS身份验证版本4,且不能与此软件包一起使用

简单电子邮件服务(SES),简单工作流服务(SWF),导入/导出,简单数据库(SimpleDB),DevPay,Mechanical Turk

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

安装

通过pip安装

$ pip install requests-aws4auth

requests-aws4auth需要Kenneth Reitz的Requests库。

requests-aws4auth已在Python 2.7和3.3及更高版本上进行了测试。

0.8版本中的行为变化

版本0.8引入了默认的请求日期检查和自动密钥再生行为。这将对线程间共享身份验证对象以及密钥存储产生影响。请参阅以下相关部分以获取详细信息。请参阅GitHub问题#10中的讨论。

基本用法

>>> import requests
>>> from requests_aws4auth import AWS4Auth
>>> endpoint = 'http://s3-eu-west-1.amazonaws.com'
>>> auth = AWS4Auth('<ACCESS ID>', '<ACCESS KEY>', '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('<ACCESS ID>', '<ACCESS KEY>', 'eu-west-1', 's3',
                    session_token='<SESSION TOKEN>')
...

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

日期处理

如果需要认证的HTTP请求包含Date或X-Amz-Date头,AWS将只接受在头中的日期与签名密钥的作用域日期匹配的授权请求(请参阅AWS REST API日期文档)。

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

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

  • 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-Date和Date头,并替换为包含当前日期的单个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 = FalseAWS4SigningKey实例来实例化它。

多线程

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

可能可以通过使用锁定原语和StrictAWS4Auth类来构建一个可工作的实例共享机制,然而,这个糟糕的作者无法想到一个既安全又不会在某些时候至少阻止所有线程在HTTP请求持续时间内运行的场景。如果连续收到多个请求,所有这些请求都需要密钥再生,则系统可能被迫长时间串行操作。

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

API参考

请参阅aws4auth.pyaws4signingkey.py中的doctrings。

测试

测试文件夹中包含了一个测试套件。

该包通过了AWS身份验证v4 测试套件中的所有测试,并包含了对受支持实时服务的测试。有关运行测试的详细信息,请参阅test/requests_aws4auth_test.py中的doctrings。

测试中包含了AWS支持API的连接参数,如果您有权访问并想尝试它。文档说明它支持auth v4,因此如果您有订阅,它应该可以正常工作。请传递您的结果!

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

  • 目前不支持Amazon S3分块上传

  • 对新AWS服务的测试

  • 即使只使用AWS4SigningKey,也需要存在Requests库

  • 连贯的文档

发布历史

0.9 (2016-02-07)

新功能

测试

  • 对STS临时凭证功能进行测试

  • 修复了AWS4SigningKey.amz_date弃用警告测试

  • Elastic MapReduce实时服务测试不再使用已弃用的DescribeJobFlows操作

0.8 (2015-12-31)

本版本引入了一些旨在减少签名密钥过时所需工作的行为变化。这对多线程和密钥存储有影响。有关详细信息,请参阅README。

新功能

  • AWS4Auth类现在会检查请求头中的日期与签名密钥范围日期是否匹配,如果不匹配,则会自动使用请求日期再生签名密钥

  • 添加了异常模块,包含新异常:RequestsAWS4AuthException, DateMismatchError, NoSecretKeyError, DateFormatError

  • 添加了StrictAWS4Auth和PassiveAWS4Auth类

AWS4Auth更改

  • 添加了regenerate_signing_key()方法,允许使用参数覆盖再生当前签名密钥

  • 添加了检查和从请求中提取日期的方法:get_request_date(), parse_date(), handle_date_mismatch()

  • __call__()现在会检查请求中的日期头,并尝试使用请求日期自动再生签名密钥,如果请求日期与签名密钥日期不同

  • 现在可以向构造函数提供一个日期

  • 将默认包含的签名头部更改为如果存在则包含“日期”头部

AWS4SigningKey 的变更

  • 添加了新的 store_secret_key 实例化参数,该参数允许控制是否将密钥存储在实例中

  • 废弃了 amz_date 属性,改用仅为“日期”

  • 在 AWS4AuthSigningKey 模块文档字符串中修复了拼写错误。感谢 jhgorrell

包变更

  • 放弃了对 Python 3.2 的支持。现在仅支持 Python 2.7 和 3.3 及以上版本,以匹配 Requests 支持的版本。

测试

  • 为新的功能添加了许多新测试

  • 添加了生成规范路径的测试,包括对 0.7 版中添加的路径百分编码修复的测试

  • 添加了生成规范查询字符串的测试

0.7 (2015-11-02)

错误修复

  • 修复了 URL 路径中的百分编码字符在签名生成时未重新编码的问题,这在所有服务(除 S3 外)都是预期的。这导致当这些字符出现在 URL 中时,认证失败。感谢 ipartola 和 cristi23 的报告。

  • 针对 ElasticSearch 的两个错误修复,感谢 Matthew Thompson 的帮助:* 在签名过程中不再设置 body 为 b'' 如果它为 None * 现在在签名生成时从 URL 网络位置中去除端口

模块

  • 升级了包含的 six.py 版本到 1.10

测试

  • 修复了 Python 2 上的几个损坏的 Unicode 测试

  • 添加了更多对编码 Unicode 请求体的测试

0.6 (2015-09-07)

错误修复

  • 在构建包中包含 HISTORY.rst 以修复 pip 源安装失败问题。感谢 Beirdo 的错误报告。

0.5 (2015-04-29)

错误修复

  • 修复了使用 x-amz-acl 头部上传到 S3 时导致的认证失败错误 - 现在用于签名的头现在包括:主机、内容类型和所有 x-amz-* 头部(除 x-amz-client-context 以外,因为它会破坏包含在内的移动分析认证)

文档

  • 对文档字符串和注释进行了细微更新

许可证

  • 将 LICENSE 的内容更改为纯 MIT 许可证

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

requests-aws4auth-redux-0.40.tar.gz (40.0 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面