Hessra SDK
The primary interface for interacting with Hessra authentication and authorization services.
This SDK provides support for both identity tokens (for authentication) and authorization tokens (for resource access), with the ability to use either mTLS certificates or identity tokens for authentication.
API Reference
This crate integrates functionality from these component crates:
hessra-token: Authorization token verification, attestation, and multi-party authorizationhessra-token-identity: Identity token creation, verification, and delegationhessra-config: Configuration managementhessra-api: HTTP client for the Hessra service with dual authentication support
Detailed Usage
Creating a Client
use ;
// Basic client setup
let client = builder
.base_url
.protocol
.build?;
// More complete setup with mTLS certificates
let mut secure_client = builder
.base_url
.protocol
.mtls_cert
.mtls_key
.server_ca
.build?;
// Finishes setting up the client by making API calls to the Hessra
// service for its token signing public key
secure_client.setup?;
// Loading from environment variables
// keys and certs should be base64 encoded PEM
let env_client = from_env?;
// Loading from a configuration file
let file_client = from_file?;
Working with Identity Tokens
Identity tokens provide authentication without requiring mTLS certificates for most operations:
// Request an identity token (requires mTLS for initial issuance)
let identity_response = client.request_identity_token.await?;
let identity_token = identity_response.token;
// Use identity token to request authorization tokens (no mTLS needed)
let auth_token = client.request_token_with_identity.await?;
// Delegate identity to a sub-identity
let laptop_token = client.attenuate_identity_token?;
// Verify identity token locally
client.verify_identity_token_local?;
Working with Authorization Tokens
The authorization service supports both mTLS and identity token authentication for requesting authorization tokens:
// Request a token
let subject = "user:123";
let resource = "resource1";
let operation = "read";
let token = client.request_token.await?;
println!;
// Simple token verification. Tries locally then fallsback to service API
let verification = client.verify_token.await?;
println!;
// Local token verification (using cached public keys)
let local_verification = client.verify_token_local?;
println!;
Advanced: Service Chain Authorization
For services that need to verify tokens passed through multiple services:
use ;
// gateway-service adds attestation
gateway_token = gateway_client.attest_service_chain_token;
// processing-service adds attestation
processing_token = processing_client.attest_service_chain_token;
// Define the service chain (order matters!)
let service_chain = builder
.add_node
.add_node
.build;
// Verify a token with the service chain
// This token is only valid if it has visited and been attested by
// the gateway-service and processing-service.
client.verify_service_chain_token.await?;
// Local verification of service chain token
client.verify_service_chain_token_local?;
Multi-Party Authorization
Handle tokens that require signoffs from multiple authorization services:
use Hessra;
// Request a token that may require multi-party authorization
let token_response = client.request_token.await?;
if let Some = token_response.pending_signoffs else if let Some = token_response.token
// Manually sign a token at a specific authorization service
let signed_response = client.sign_token.await?;
Error Handling
The SDK provides a comprehensive error handling system:
use HessraError;
Feature Flags
Note: http3 support is currently unstable since it relies on reqwest's implementation which is also unstable. Once reqwest's http3 is stable, it will be here too.
WASM support is currently a WIP. Please open an issue if you need WASM or the ability for offline token verification in javascript/typescript.
toml: Enables TOML configuration file support via thehessra-configcratehttp3: Enables HTTP/3 protocol support via thehessra-apicratewasm: Enables WebAssembly support for token verification via thehessra-tokencrate
Using HTTP/3
When the http3 feature is enabled:
use ;
let client = builder
.base_url
.protocol
.build?;
requires building with RUSTFLAGS='--cfg reqwest_unstable'
Once reqwest http3 support is stable, this won't be necessary.
License
Licensed under the Apache License, Version 2.0.