Usecase agnostic implementation of AWS4 signing schema.
Project description
Usecase agnostic implementation of AWS4 Sig v4
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file auth_aws4-0.1.9.tar.gz.
File metadata
- Download URL: auth_aws4-0.1.9.tar.gz
- Upload date:
- Size: 55.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3359bdadca5fae0709768d4dc86c8a5bf8f3ca9a2d4304cbda3d0214726004c
|
|
| MD5 |
6a3d5cad2b5dbad435dc2dc902e17605
|
|
| BLAKE2b-256 |
b2c9a5db2c0ea2849dc5699e1f33253e0e6e04a031caf03c1b236354cc6b68eb
|
File details
Details for the file auth_aws4-0.1.9-py3-none-any.whl.
File metadata
- Download URL: auth_aws4-0.1.9-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8667cac005a5f1673cffb041f0b3e80133caf8ce88677bb15c87f62cec229478
|
|
| MD5 |
a234c46a98f911bad9aa008d25cac7ec
|
|
| BLAKE2b-256 |
25122824c76094d4e5639768b83705579518bba32deed7db95a8c730c9f80214
|