pydpop
RFC 9449 DPoP (Demonstrating Proof of Possession) for Python — proof generation and verification, in one tiny dependency-light package.
Why does this exist? It's 2026 and Python still has no production-ready DPoP library. Authlib's DPoP issue has been open since 2021. Every Python shop rolling OAuth 2.1 / MCP servers with sender-constrained tokens is hand-rolling proofs or skipping DPoP entirely. This fills that gap.
Quickstart
from pydpop import generate_key, generate_proof, verify_proof, MemoryJtiStore
# --- client side: sign one proof per HTTP request ---
key = generate_key() # keep this private, persist it yourself
proof = generate_proof(
private_key=key,
htm="POST",
htu="https://auth.example.com/token",
)
headers = {"DPoP": proof}
# --- server side: verify ---
store = MemoryJtiStore() # replay cache; use Redis/DB in production
bound = verify_proof(
proof=proof,
htm="POST",
htu="https://auth.example.com/token",
jti_store=store,
)
print(bound["jwk_thumbprint"]) # compare against the access token's cnf.jkt
With an access token bound to the proof (ath claim):
proof = generate_proof(private_key=key, htm="GET",
htu="https://api.example.com/data",
access_token="the-access-token")
verify_proof(proof=proof, htm="GET", htu="https://api.example.com/data",
access_token="the-access-token")
Scope
v0.1 — pure RFC 9449: ES256 (P-256) proof generation, full server-side verification (typ, alg, signature, htm/htu, iat window, jti replay cache, nonce, ath binding), RFC 7638 JWK thumbprints.
v0.2 (roadmap) — hybrid post-quantum signatures (ML-DSA-65 + classical), making this the first PQC-ready Python DPoP library. Algorithm agility by configuration, not by rewriting your code.
Verification checklist
- Round-trip: generate → verify
- Negative tests: tampered payload, wrong
htm/htu, staleiat, replayedjti,ath/noncemismatch, JWK substitution - Interop against Keycloak 26.4+ (DPoP-capable) — stretch goal, tracked in issues
Contributing
Issues and PRs welcome — especially interop reports against real authorization servers. Run pytest before submitting.
License
MIT
Metadata
Release files for pydpop 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pydpop-0.1.1.tar.gz | 15.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pydpop-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.6 kB
Release files / pydpop-0.1.1.tar.gz
| Download URL | pydpop-0.1.1.tar.gz |
|---|---|
| Size | 15.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7049075eec611e01b7ce9d43f4500bd86e932fc9bc37f1f35737359ba3dc2156
|
|
BLAKE2b-256 checksum How to use checksums |
9e23b962d8b7340c40467ebaa3cf5f171b9fd726819a9802d1edf2b2f76db54f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / pydpop-0.1.1-py3-none-any.whl
| Download URL | pydpop-0.1.1-py3-none-any.whl |
|---|---|
| Size | 7.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7da8e8d88d3b775faff13bfb214e974994ad2cf74531f45e8af4061193f9dfcc
|
|
BLAKE2b-256 checksum How to use checksums |
f823e1db951ff8eeff2429278df3daf499d02fce6b8a9443ba18cbad7642c20d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency log