| Crates.io | reqsign-aws-v4 |
| lib.rs | reqsign-aws-v4 |
| version | 1.0.0 |
| created_at | 2025-09-01 09:55:21.592819+00 |
| updated_at | 2025-09-01 09:55:21.592819+00 |
| description | Signing API requests without effort. |
| homepage | |
| repository | https://github.com/Xuanwo/reqsign |
| max_upload_size | |
| id | 1819369 |
| size | 305,461 |
AWS SigV4 signing implementation for reqsign.
This crate provides AWS Signature Version 4 (SigV4) signing capabilities for authenticating requests to AWS services like S3, DynamoDB, Lambda, and more.
use reqsign_aws_v4::{Builder, Config, DefaultLoader};
use reqsign_core::{Context, Signer};
// Create context and signer
let ctx = Context::default();
let config = Config::default().from_env().from_profile();
let loader = DefaultLoader::new(config);
let builder = Builder::new("s3", "us-east-1");
let signer = Signer::new(ctx, loader, builder);
// Sign requests
let mut req = http::Request::get("https://s3.amazonaws.com/mybucket/mykey")
.body(())
.unwrap()
.into_parts()
.0;
signer.sign(&mut req, None).await?;
This crate supports loading credentials from:
Environment Variables
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_SESSION_TOKEN=your_session_token # Optional
Credential File (~/.aws/credentials)
[default]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_key
[production]
aws_access_key_id = prod_access_key
aws_secret_access_key = prod_secret_key
IAM Roles (EC2, ECS, Lambda)
AssumeRole with STS
let config = Config::default()
.role_arn("arn:aws:iam::123456789012:role/MyRole")
.role_session_name("my-session");
Web Identity Tokens (EKS/Kubernetes)
Works with any AWS service using SigV4:
// List buckets
let req = http::Request::get("https://s3.amazonaws.com/")
.header("x-amz-content-sha256", EMPTY_STRING_SHA256)
.body(())?;
// Get object
let req = http::Request::get("https://bucket.s3.amazonaws.com/key")
.header("x-amz-content-sha256", EMPTY_STRING_SHA256)
.body(())?;
// List tables
let req = http::Request::post("https://dynamodb.us-east-1.amazonaws.com/")
.header("x-amz-target", "DynamoDB_20120810.ListTables")
.header("content-type", "application/x-amz-json-1.0")
.body(json!({}))?;
Check out more examples:
let config = Config::default()
.profile("production")
.from_profile();
let config = Config::default()
.role_arn("arn:aws:iam::123456789012:role/MyRole")
.external_id("unique-external-id")
.duration_seconds(3600);
let config = Config::default()
.access_key_id("AKIAIOSFODNN7EXAMPLE")
.secret_access_key("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
.session_token("optional-session-token");
Licensed under Apache License, Version 2.0.