auth-aws4


Nameauth-aws4 JSON
Version 0.1.8 PyPI version JSON
download
home_pageNone
SummaryUsecase agnostic implementation of AWS4 signing schema.
upload_time2024-09-09 16:00:25
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords authorization aws signing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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

```python
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,
    )
```

## Extra credit

Thanks to [@ozzzzz](https://www.github.com/ozzzzz) and
[@ivanmisic](https://www.github.com/ivanmisic) for work on the initial
httpx/fastapi implementations this was extracted from.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "auth-aws4",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Daniel Edgecombe <daniel@nrwl.co>",
    "keywords": "authorization, aws, signing",
    "author": null,
    "author_email": "Daniel Edgecombe <daniel@nrwl.co>",
    "download_url": "https://files.pythonhosted.org/packages/c1/38/00468b3a98acb3e90e4b6a403613710c07d74f2d262f21afc9686ce3a898/auth_aws4-0.1.8.tar.gz",
    "platform": null,
    "description": "# Usecase agnostic implementation of AWS4 Sig v4\n\nThis implementation aims to be usecase agnostic. As such it accepts the\ncomponent pieces of a request rather than a full opinionated request object\nlike `httpx.Request`.\n\nhttps://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\n\n## Usage\n\n### Validation\n\n```python\nfrom aws4 import generate_challenge, validate_challenge\n\npayload = \"<extract content from request>\"\n\nchallenge = generate_challenge(\n    method=request.method,\n    url=request.url,\n    headers=request.headers,\n    content=payload.decode(\"utf-8\"),\n)\n\nsecret_access_key = <load secret key using the challenge.access_key_id>\n\nvalidate_challenge(challenge, secret_key.secret_access_key)\n```\n\n### Signing\n\nAn example of an httpx AWS4 request signing. In this example the `Authorization` header is injected into `request.headers`\n\n```\nfrom datetime import datetime, timezone\n\nimport aws4\n\n\nservice = \"s3\"\nregion = \"us-east-1\"\naccess_key_id = \"my-access-key-id\"\nsecret_access_key = \"my-secret-access-key\"\n\ndef http_aws4_auth(request: httpx.Request):\n    dt = datetime.now(tz=timezone.utc)\n    request.headers[\"x-amz-date\"] = aws4.to_amz_date(dt)\n    request.headers[\"host\"] = request.url.netloc.decode(\"utf-8\")\n\n    body = request.content.decode(\"utf-8\")\n    if body:\n        request.headers[\"Content-Length\"] = str(len(body))\n\n    aws4.sign_request(\n        service,\n        request.method,\n        request.url,\n        region,\n        request.headers,\n        body,\n        access_key_id,\n        secret_access_key,\n        dt,\n    )\n\nwith httpx.Client() as client:\n    r = client.request(\n        url=\"http://localhost\",\n        auth=auth,\n    )\n```\n\n## Extra credit\n\nThanks to [@ozzzzz](https://www.github.com/ozzzzz) and\n[@ivanmisic](https://www.github.com/ivanmisic) for work on the initial\nhttpx/fastapi implementations this was extracted from.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Usecase agnostic implementation of AWS4 signing schema.",
    "version": "0.1.8",
    "project_urls": null,
    "split_keywords": [
        "authorization",
        " aws",
        " signing"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f4145d7512f6dd5b6ea2a8087b70922018523214d4cca33ca51035722e8f8343",
                "md5": "cb2887db31e435754799ceaaab829dea",
                "sha256": "039429b8d1b64bddbf311cc733388149823036f66cbdc6db7dee921417922f3e"
            },
            "downloads": -1,
            "filename": "auth_aws4-0.1.8-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "cb2887db31e435754799ceaaab829dea",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 8414,
            "upload_time": "2024-09-09T16:00:24",
            "upload_time_iso_8601": "2024-09-09T16:00:24.044616Z",
            "url": "https://files.pythonhosted.org/packages/f4/14/5d7512f6dd5b6ea2a8087b70922018523214d4cca33ca51035722e8f8343/auth_aws4-0.1.8-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c13800468b3a98acb3e90e4b6a403613710c07d74f2d262f21afc9686ce3a898",
                "md5": "fcdecbbb06e8612a09b9e072008b97ae",
                "sha256": "1b5545210f9ef1da7290981e67b932b9530c50c1efbcf640fac0cf4c63976de1"
            },
            "downloads": -1,
            "filename": "auth_aws4-0.1.8.tar.gz",
            "has_sig": false,
            "md5_digest": "fcdecbbb06e8612a09b9e072008b97ae",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 55119,
            "upload_time": "2024-09-09T16:00:25",
            "upload_time_iso_8601": "2024-09-09T16:00:25.190870Z",
            "url": "https://files.pythonhosted.org/packages/c1/38/00468b3a98acb3e90e4b6a403613710c07d74f2d262f21afc9686ce3a898/auth_aws4-0.1.8.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-09 16:00:25",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "auth-aws4"
}
        
Elapsed time: 0.81731s