Skip to main content

Usecase agnostic implementation of AWS4 Sig v4

uv ruff image image image style tests codecov

This implementation aims to be usecase agnostic. As such it accepts the component pieces of a request rather than a full opinionated request object like httpx.Request.

https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html

Usage

Validation

from aws4 import generate_challenge, validate_challenge

payload = "<extract content from request>"

challenge = generate_challenge(
    method=request.method,
    url=request.url,
    headers=request.headers,
    content=payload.decode("utf-8"),
)

secret_access_key = <load secret key using the challenge.access_key_id>

validate_challenge(challenge, secret_key.secret_access_key)

Signing

An example of an httpx AWS4 request signing. In this example the Authorization header is injected into request.headers

from datetime import datetime, timezone

import aws4


service = "s3"
region = "us-east-1"
access_key_id = "my-access-key-id"
secret_access_key = "my-secret-access-key"

def http_aws4_auth(request: httpx.Request):
    dt = datetime.now(tz=timezone.utc)
    request.headers["x-amz-date"] = aws4.to_amz_date(dt)
    request.headers["host"] = request.url.netloc.decode("utf-8")

    body = request.content.decode("utf-8")
    if body:
        request.headers["Content-Length"] = str(len(body))

    aws4.sign_request(
        service,
        request.method,
        request.url,
        region,
        request.headers,
        body,
        access_key_id,
        secret_access_key,
        dt,
    )

with httpx.Client() as client:
    r = client.request(
        url="http://localhost",
        auth=auth,
    )

Builtin httpx client

Currently there is only a builtin client for httpx, if you think there is a client implementation that would be useful to include, please raise an issue on github.

from datetime import datetime, timezone

import aws4
from aws4.key_pair import KeyPair
from aws4.client import HttpxAWS4Auth


auth = HttpxAWS4Auth(
    KeyPair(
        access_key_id="my-access-key-id",
        secret_access_key="my-secret-access-key",
    )
    "s3",
    "us-east-1",
)

with httpx.Client() as client:
    r = client.request(
        url="http://localhost",
        auth=auth,
    )

Extra credit

Thanks to @ozzzzz and @ivanmisic for work on the initial httpx/fastapi implementations this was extracted from.

Metadata

Release files for auth-aws4 0.1.13

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for auth-aws4 0.1.13
File Size Uploaded Provenance Actions
auth_aws4-0.1.13.tar.gz 77.5 kB Without provenance Details for auth_aws4-0.1.13.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for auth-aws4 0.1.13
File Interpreter ABI Platform Actions
auth_aws4-0.1.13-py3-none-any.whl Python 3 none any Details for auth_aws4-0.1.13-py3-none-any.whl

Total release size: 86.5 kB

Release files / auth_aws4-0.1.13.tar.gz

Download URL auth_aws4-0.1.13.tar.gz
Size 77.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ee64769a6c89e3cba95dc4cdad81d0c332e91b6966005cfe65d227e9616f5bff
BLAKE2b-256 checksum
How to use checksums
415ea40fe6a1db269fcd477aab0388feb559491d06b35967d51846799ef63ed9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / auth_aws4-0.1.13-py3-none-any.whl

Download URL auth_aws4-0.1.13-py3-none-any.whl
Size 9.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
98202e2a9463c04194ed401b4d11b7837a2a869477b28f6a9e5ffd4614855779
BLAKE2b-256 checksum
How to use checksums
2f1d7ded70f0ff63f8aa8183d27be2b49ae776cec57c9d1d20b4e6f325a26e5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Security for auth-aws4 0.1.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page