Skip to main content

Implements a middleware that protects FastAPI endpoints with RFC 3230 Digest headers.

Project description

Test Coverage Versions

FastAPI RFC 3230 Digest Header Middleware

Introduction

This package provides a FastAPI middleware that enforces RFC 3230 Digest headers for HTTP requests. It validates the Digest header against the request body, ensuring message integrity and allowing you to specify which digest algorithms are accepted.

Installation

Install via pip:

pip install fastapi-rfc3230-digest-header-middleware

Usage Example

Add the middleware to your FastAPI app:

from fastapi import FastAPI, Request
from fastapi_rfc3230_digest_header_middleware import Middleware

app = FastAPI()
app.add_middleware(Middleware)

@app.post("/echo")
async def echo(request: Request):
    body = await request.body()
    return body

This will require all POST requests to /echo to include a valid Digest header matching the request body. If the client sends an invalid request, the server will respond with a 422 Unprocessable Entity error and include details about the validation failure. The response will also include a Want-Digest header indicating the accepted digest algorithms.

Client side

Sending requests with Digest Header

The client must compute the digest of the request body using one of the accepted algorithms and include it in the Digest header. For example, to compute a SHA-256 digest in Python you can use the rfc3230-digest-headers package:

from rfc3230_digest_headers import create_digest

body = b"Hello, World!"
digest_header = create_digest(body)
headers = {"Digest": digest_header.header_value}

if you want to manually create the header, you can do it like this:

import hashlib
import base64
body = b"Hello, World!"
sha256_digest = hashlib.sha256(body).digest()
digest_value = base64.b64encode(sha256_digest).decode('utf-8')
digest_header = f"SHA-256={digest_value}"
headers = {"Digest": digest_header}

Client side handling of Want-Digest Header

The client should also be able to handle the Want-Digest header in case of a 422 response. The rfc3230-digest-headers package can help with parsing this header as well.

from rfc3230_digest_headers import create_digest
want_digest_header = response.headers.get("Want-Digest", "")

# The `digest_value` will include the appropriate digests according to the server's Want-Digest header
digest_header = create_digest(body, want_digest_header)

Configuration

You can customize which digest algorithms are allowed or provide a custom callback to extract the bytes to validate:

Allow Only Specific Algorithms

from fastapi import FastAPI, Request
from fastapi_rfc3230_digest_header_middleware import Middleware
from rfc3230_digest_headers import DigestHeaderAlgorithm

qvalues = {
    DigestHeaderAlgorithm.SHA256: None,  # allow SHA-256
    DigestHeaderAlgorithm.MD5: 0.0,      # explicitly reject MD5
}

app = FastAPI()
app.add_middleware(Middleware, qvalues=qvalues)

@app.post("/echo")
async def echo(request: Request):
    body = await request.body()
    return body

Custom Instance Bytes Callback

The instance are the bytes the server and client agreed on to include in the digest. By default, this is the entire request body, but instance of a request may not always be the request body. You can provide a custom callback to extract the bytes to validate:

async def get_instance_bytes(request: Request) -> bytes:
    # Default instance bytes logic
    return await request.body()

app = FastAPI()
app.add_middleware(Middleware, instance_bytes_callback=get_instance_bytes)

License

MIT License

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

Built Distribution

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

File details

Details for the file fastapi_rfc3230_digest_header_middleware-1.0.2.tar.gz.

File metadata

File hashes

Hashes for fastapi_rfc3230_digest_header_middleware-1.0.2.tar.gz
Algorithm Hash digest
SHA256 919dc83248eb3e14883a83f0e90f8a6031af751d0207046f33a85b2f78e990e8
MD5 f3149a22523b9a56c30aaa0c909d7af2
BLAKE2b-256 b8267e70fc1a57e64fb618b352cb270a9a6cc0b2eeca0f646f05f0748dda1c33

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rfc3230_digest_header_middleware-1.0.2.tar.gz:

Publisher: publish.yml on Mari6814/fastapi-rfc3230-digest-header-middleware

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastapi_rfc3230_digest_header_middleware-1.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_rfc3230_digest_header_middleware-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 67870534e9afc32c1679fcd4cf33b13ba7cc80ece785556b1ce74bda875f3be7
MD5 df8143b625ff576b6e3302388224cefc
BLAKE2b-256 13d6c982b5b7b9d94c838b8fa0da1f474c5ad49d548cdd8c999c292f2bc80504

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rfc3230_digest_header_middleware-1.0.2-py3-none-any.whl:

Publisher: publish.yml on Mari6814/fastapi-rfc3230-digest-header-middleware

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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