Skip to main content

Async AWS Signature V4 — framework-agnostic, stdlib-only verify/sign/presign

Project description

asigv4

Async AWS Signature V4 — framework-agnostic, stdlib-only verify / sign / presign.

  • 零运行时依赖:纯 Python 标准库(hmac / hashlib / re / datetime / urllib
  • 全异步 I/O:密钥查找、请求体读取均为 async;签名/预签名为同步纯函数
  • 框架无关:核心 verify() 接受原始参数,不绑定任何 Web 框架;body 读取由调用方按自身节奏控制
  • 时间完全可控now 注入签名/校验时间、clock 注入时钟源、max_skew_seconds=None 关闭偏差检查
  • Python 3.10+,附 py.typed 类型标记(PEP 561)

安装

pip install asigv4

快速开始

服务端校验

SigV4Verifier.verify() 接受原始参数,调用方从自己框架的 Request 对象中提取即可。 body 接受 bytes 或返回 bytes 的协程,仅在 payload 需要计算哈希时才会被调用 (UNSIGNED-PAYLOAD / STREAMING-* 会跳过,大文件零开销)。

from asigv4 import SigV4Verifier

KEYS = {"AKIAIOSFODNN7EXAMPLE": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"}
verifier = SigV4Verifier(lambda ak: KEYS.get(ak))

# 示例:从任意框架的 request 中提取参数后调用
async def handle(request):
    access_key_id = await verifier.verify(
        method=request.method,
        path=request.url.path,
        headers={k.lower(): v for k, v in request.headers.items()},
        query_params=dict(request.query_params),
        body=request.body,   # bytes 或 callable,仅在需要时才被 await
    )
    return access_key_id

密钥查找回调兼容同步与异步:

async def db_lookup(access_key_id: str) -> str | None:
    row = await pool.fetchrow(
        "SELECT secret_key FROM access_keys WHERE key_id = $1", access_key_id
    )
    return row["secret_key"] if row else None

verifier = SigV4Verifier(db_lookup)   # 直接传 async 函数

生成预签名 URL

from asigv4 import presign_url

url = presign_url(
    method="GET",
    host="bucket.s3.amazonaws.com",
    path="/bucket/key.txt",
    access_key_id="AKIAIOSFODNN7EXAMPLE",
    secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    expires=3600,
)
# scheme="http" 可用于本地测试或 TLS 终止代理

客户端签名请求

from asigv4 import sign_request

auth_header = sign_request(
    method="PUT",
    path="/bucket/key.txt",
    headers={"host": "bucket.s3.amazonaws.com"},
    body=b"file content",
    access_key_id="AKIAIOSFODNN7EXAMPLE",
    secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
)

时间控制

三档自由控制,覆盖测试注入、时钟漂移补偿、合规审计等场景:

from datetime import datetime, timezone
from asigv4 import SigV4Verifier, sign_request

# 1) 签名时固定 now → 完全确定性(测试 / 互操作向量)
fixed = datetime(2026, 1, 1, 12, 0, 0, tzinfo=timezone.utc)
auth = sign_request(method="GET", path="/k", headers={"host": "h"},
                    access_key_id=AK, secret_key=SK, now=fixed)

# 2) 校验时注入 clock → 固定时间源(测试 / 已知时钟漂移补偿)
verifier = SigV4Verifier(lambda ak: KEYS.get(ak), clock=lambda: fixed)
ak = await verifier.verify(method="GET", path="/k",
                           headers=headers, query_params={})

# 3) per-call now 覆盖构造器 clock
ak = await verifier.verify(method="GET", path="/k",
                           headers=headers, query_params={}, now=fixed)

# 4) max_skew_seconds=None 彻底关闭偏差检查(完全自由控制时间)
verifier = SigV4Verifier(lambda ak: KEYS.get(ak), max_skew_seconds=None)

异常

所有错误均为 SigV4Error 子类:

异常 含义
InvalidAuthorizationError Authorization 头格式错误或缺失,或预签名 URL 参数不完整
SignatureMismatchError 签名不匹配
RequestExpiredError 请求时间偏差超限或预签名 URL 已过期
UnknownAccessKeyError access_key_id 无法找到对应密钥

捕获基类 SigV4Error 即可统一处理(推荐,避免泄露 key 是否存在)。

API

详见 sign_design.md

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asigv4-0.1.0.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

asigv4-0.1.0-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file asigv4-0.1.0.tar.gz.

File metadata

  • Download URL: asigv4-0.1.0.tar.gz
  • Upload date:
  • Size: 15.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for asigv4-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d8c4003ff1f633bab7f2515fe7c110964b62532f29827c88ed26fe97a2e09bb6
MD5 2d261b08d857e9d84151ae787d7b4538
BLAKE2b-256 207c723258599aee67d1120b943f5c31f1f2f9860191f16bca30c06a79c32715

See more details on using hashes here.

File details

Details for the file asigv4-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: asigv4-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for asigv4-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fad693fee786567a3885635b204df906609a6881c9e66ecdebf7cbb543d5f70d
MD5 4a7cb9861511079e07664b8ca21dab6c
BLAKE2b-256 a3a01a405506ac450e0cbe3071584852650d4db54b3c248aa2180a63cbbd21b5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page