| Crates.io | reqsign |
| lib.rs | reqsign |
| version | 0.17.0 |
| created_at | 2022-03-12 08:40:25.881148+00 |
| updated_at | 2025-09-02 04:20:36.894017+00 |
| description | Signing HTTP requests for AWS, Azure, Google, Huawei, Aliyun, Tencent and Oracle services |
| homepage | |
| repository | https://github.com/Xuanwo/reqsign |
| max_upload_size | |
| id | 548683 |
| size | 88,552 |
Signing HTTP requests for AWS, Azure, Google, Huawei, Aliyun, Tencent and Oracle services.
This crate provides a unified interface for signing HTTP requests across multiple cloud providers:
Add reqsign to your Cargo.toml:
[dependencies]
reqsign = "0.17"
By default, this includes the default-context feature which provides a ready-to-use context implementation using reqwest and tokio.
To use specific services only:
[dependencies]
reqsign = { version = "0.17", default-features = false, features = ["aws", "default-context"] }
The easiest way to get started is using the default signers provided for each service:
use anyhow::Result;
use reqsign::aws;
#[tokio::main]
async fn main() -> Result<()> {
// Create a default signer for AWS S3 in us-east-1
// This will automatically:
// - Set up HTTP client and file reader
// - Load credentials from environment, config files, or instance metadata
let signer = aws::default_signer("s3", "us-east-1");
// Build and sign a request
let mut req = http::Request::builder()
.method(http::Method::GET)
.uri("https://s3.amazonaws.com/my-bucket/my-object")
.body(())
.unwrap()
.into_parts()
.0;
signer.sign(&mut req, None).await?;
println!("Request signed successfully!");
Ok(())
}
For more control, you can manually assemble the signer components:
use anyhow::Result;
use reqsign::{Context, Signer, default_context};
use reqsign::aws::{DefaultCredentialProvider, RequestSigner};
#[tokio::main]
async fn main() -> Result<()> {
// Create a context with default implementations
let ctx = default_context();
// Or build your own context with specific implementations
let ctx = Context::new()
.with_file_read(reqsign_file_read_tokio::TokioFileRead)
.with_http_send(reqsign_http_send_reqwest::ReqwestHttpSend::default())
.with_env(reqsign::OsEnv);
// Configure credential provider and request signer
let credential_provider = DefaultCredentialProvider::new();
let request_signer = RequestSigner::new("s3", "us-east-1");
// Assemble the signer
let signer = Signer::new(ctx, credential_provider, request_signer);
// Build and sign a request
let mut req = http::Request::builder()
.method(http::Method::GET)
.uri("https://s3.amazonaws.com/my-bucket/my-object")
.body(())
.unwrap()
.into_parts()
.0;
signer.sign(&mut req, None).await?;
println!("Request signed successfully!");
Ok(())
}
You can customize the default signers using the with_* methods:
use reqsign::aws;
use reqsign::aws::StaticCredentialProvider;
// Start with default signer and customize components
let signer = aws::default_signer("s3", "us-east-1")
.with_credential_provider(StaticCredentialProvider::new(
"my-access-key",
"my-secret-key",
None, // Optional session token
))
.with_context(my_custom_context);
// Azure Storage
use reqsign::azure;
let signer = azure::default_signer();
// Google Cloud
use reqsign::google;
let signer = google::default_signer("storage.googleapis.com");
// Aliyun OSS
use reqsign::aliyun;
let signer = aliyun::default_signer("mybucket");
// Huawei Cloud OBS
use reqsign::huaweicloud;
let signer = huaweicloud::default_signer("mybucket");
// Tencent COS
use reqsign::tencent;
let signer = tencent::default_signer();
// Oracle Cloud
use reqsign::oracle;
let signer = oracle::default_signer();
default: Enables default-contextdefault-context: Provides a default context implementation using reqwest and tokioaliyun: Enable Aliyun OSS supportaws: Enable AWS services supportazure: Enable Azure Storage supportgoogle: Enable Google Cloud supporthuaweicloud: Enable Huawei Cloud OBS supportoracle: Enable Oracle Cloud supporttencent: Enable Tencent COS supportThis crate supports WebAssembly (WASM) targets. However, the default-context feature is not available on WASM due to platform limitations. When targeting WASM, you should:
reqsign-file-read-tokio and reqsign-http-send-reqwest cratesExample for WASM:
[dependencies]
reqsign = { version = "0.17", default-features = false, features = ["aws"] }
reqsign-http-send-reqwest = "0.1"