Crates.io | turbomcp-dpop |
lib.rs | turbomcp-dpop |
version | 1.1.0-exp.3 |
created_at | 2025-08-28 01:19:44.313201+00 |
updated_at | 2025-08-29 19:50:54.931861+00 |
description | RFC 9449 compliant Demonstration of Proof-of-Possession (DPoP) implementation for TurboMCP |
homepage | |
repository | https://github.com/Epistates/turbomcp |
max_upload_size | |
id | 1813435 |
size | 394,837 |
RFC 9449 compliant Demonstration of Proof-of-Possession (DPoP) implementation for TurboMCP
turbomcp-dpop
provides a production-ready implementation of RFC 9449 Demonstration of Proof-of-Possession (DPoP) for enhanced OAuth 2.0 security. DPoP is a mechanism that enables the binding of access tokens to a specific client, preventing token theft and replay attacks.
use turbomcp_dpop::{DpopKeyManager, DpopProofGenerator};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a key manager (in-memory for demo)
let key_manager = DpopKeyManager::new_memory().await?;
// Create proof generator
let proof_generator = DpopProofGenerator::new(key_manager.into());
// Generate DPoP proof for API request
let proof = proof_generator.generate_proof(
"POST",
"https://api.example.com/resource",
Some("access_token_here")
).await?;
println!("DPoP proof: {}", proof);
Ok(())
}
use turbomcp::prelude::*;
use turbomcp_dpop::{DpopKeyManager, DpopProofGenerator};
#[derive(Clone)]
struct SecureServer {
dpop_generator: DpopProofGenerator,
}
#[server]
impl SecureServer {
#[tool("Make authenticated API call with DPoP")]
async fn secure_api_call(&self, url: String) -> McpResult<String> {
// Generate DPoP proof for the request
let proof = self.dpop_generator.generate_proof(
"GET",
&url,
None
).await?;
// Use proof in HTTP headers
// DPoP: <proof_jwt>
// Authorization: Bearer <access_token>
Ok(format!("Request to {} with DPoP proof", url))
}
}
use turbomcp_dpop::DpopKeyManager;
let key_manager = DpopKeyManager::new_memory().await?;
use turbomcp_dpop::DpopKeyManager;
let key_manager = DpopKeyManager::new_redis("redis://localhost:6379").await?;
use turbomcp_dpop::DpopKeyManager;
let key_manager = DpopKeyManager::new_hsm(hsm_config).await?;
DPoP enhances OAuth 2.0 security through:
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β Client ββββββΆβ Server ββββββΆβ Resource β
β β β β β Server β
β - Generates β β - Validates β β - Verifies β
β DPoP JWT β β DPoP JWT β β Token β
β - Binds to β β - Issues β β Binding β
β Token β β Token β β β
βββββββββββββββ βββββββββββββββ βββββββββββββββ
use turbomcp_dpop::{DpopKeyManager, KeyRotationPolicy};
let key_manager = DpopKeyManager::new_redis("redis://localhost:6379")
.await?
.with_rotation_policy(KeyRotationPolicy::Daily)
.with_cleanup_expired_keys(true);
use turbomcp_dpop::{DpopValidator, DpopConfig};
// Validate DPoP proof during token request
let validator = DpopValidator::new(DpopConfig::default());
match validator.validate_proof(&dpop_header, &request) {
Ok(claims) => {
// Bind access token to DPoP key
let access_token = bind_token_to_dpop_key(claims.public_key);
// Issue token...
}
Err(e) => {
// Reject request
return Err(e);
}
}
use turbomcp_dpop::{DpopValidator, AccessTokenValidator};
// Validate both access token and DPoP proof
let dpop_validator = DpopValidator::new(DpopConfig::default());
let token_validator = AccessTokenValidator::new();
// Validate DPoP proof
let dpop_claims = dpop_validator.validate_proof(&dpop_header, &request)?;
// Validate access token binding
let token_claims = token_validator.validate_token(&access_token)?;
if !token_claims.is_bound_to_key(&dpop_claims.public_key) {
return Err(DpopError::TokenBindingMismatch);
}
use turbomcp_dpop::{DpopError, DpopResult};
match proof_generator.generate_proof("GET", &url, None).await {
Ok(proof) => println!("Generated proof: {}", proof),
Err(DpopError::KeyManagementError(e)) => {
eprintln!("Key management error: {}", e);
}
Err(DpopError::JwtError(e)) => {
eprintln!("JWT error: {}", e);
}
Err(DpopError::ValidationError(msg)) => {
eprintln!("Validation error: {}", msg);
}
}
Feature | Description | Default |
---|---|---|
redis |
Enable Redis key storage | β |
hsm |
Enable HSM integration | β |
serde |
Enable serde serialization | β |
Licensed under the MIT License.
Part of the TurboMCP high-performance Rust SDK for the Model Context Protocol.