5 个版本

0.0.5 2024年8月27日
0.0.4 2024年8月25日
0.0.3 2024年8月25日
0.0.2 2024年8月25日
0.0.1 2024年8月25日

335网页编程

Download history 241/week @ 2024-08-20

每月 241 次下载

MIT 许可证

27KB
446

不工作,需要修复,乐意接受 PR

aws_signer

aws_signer 是一个 Rust 库,它实现了 AWS Signature Version 4 签名,用于向 AWS 服务发送认证请求,包括生成预签名 URL。此库与 Cloudflare Workers 和 Cloudflare R2 兼容,允许您以 AWS 和 Cloudflare 可以验证的方式签名 HTTP 请求,确保安全通信。

功能

  • 对 HTTP 请求的 AWS Signature Version 4 签名
  • 支持生成预签名 URL 以进行临时访问
  • 与 Cloudflare Workers 和 Cloudflare R2 兼容
  • 灵活配置 AWS 凭据和区域
  • 设计用于轻松集成 reqwest 以进行 HTTP 请求

安装

要在您的 Rust 项目中使用 aws_signer 库,请将其添加到您的 Cargo.toml 中的依赖项

[dependencies]
aws_signer = "0.1"

用法

设置客户端

要使用您的凭据创建新的 AWS 客户端,请使用 AwsClient::new 函数

use aws_signer::{AwsClient, AwsOptions, AwsRequestInit};

fn main() {
    let client = AwsClient::new(
        "your_access_key_id".to_string(),
        "your_secret_access_key".to_string(),
        None, // Optional session token if required
        None, // Service will be guessed if None
        None, // Region will be guessed if None
        None,
        Some(3), // Retries
        Some(100), // Initial retry delay in ms
    );

    // Use the client to sign requests or fetch data
}

签名请求

您可以使用 AwsClientsign 方法来签名 HTTP 请求。以下示例展示了如何使用 reqwest crate 签名请求

use aws_signer::{AwsClient, AwsRequestInit};
use reqwest::{Request, Method, Url};

#[tokio::main]
async fn main() {
    let client = AwsClient::new(
        "your_access_key_id".to_string(),
        "your_secret_access_key".to_string(),
        None, // Optional session token if required
        None, // Service will be guessed if None
        None, // Region will be guessed if None
        None,
        Some(3), // Retries
        Some(100), // Initial retry delay in ms
    );

    let request = Request::new(
        Method::PUT,
        Url::parse("https://your-bucket.your-account.r2.cloudflarestorage.com/test-file").unwrap(),
    );

    match client.fetch(request, None).await {
        Ok(response) => {
            println!("Response: {:?}", response.text().await.unwrap());
        }
        Err(err) => {
            eprintln!("Error: {}", err);
        }
    }
}

生成预签名 URL

要为临时上传到 S3 或其他 AWS 服务生成预签名 URL

use aws_signer::{AwsClient, AwsOptions, AwsRequestInit};
use reqwest::{Request, Method, Url};

#[tokio::main]
async fn main() {
    let client = AwsClient::new(
        "your_access_key_id".to_string(),
        "your_secret_access_key".to_string(),
        None, // Optional session token if required
        Some("s3".to_string()), // Specify the service
        Some("us-east-1".to_string()), // Specify the region
        None,
        Some(3),
        Some(100),
    );

    let request = Request::new(
        Method::PUT,
        Url::parse("https://your-bucket.s3.amazonaws.com/your-object-key").unwrap(),
    );

    match client.sign(request, None).await {
        Ok(signed_request) => {
            println!("Presigned URL: {}", signed_request.url());
        }
        Err(err) => {
            eprintln!("Error: {}", err);
        }
    }
}

配置

该库通过 AwsOptions 结构体提供灵活的配置选项。您可以自定义签名过程、服务、区域等

  • access_key_id:AWS 访问密钥 ID
  • secret_access_key:AWS 秘密访问密钥
  • session_token:可选的会话令牌,用于临时凭据
  • service:AWS 服务名称(例如,“s3”,“execute-api”)
  • region:AWS 区域(例如,“us-east-1”)
  • datetime:自定义签名日期和时间
  • sign_query:布尔标志,指示是否对查询进行签名
  • append_session_token:布尔标志,用于追加会话令牌

兼容性

  • Cloudflare Workers:此库可在 Cloudflare Workers 中使用以签名请求,非常适合无服务器环境。
  • Cloudflare R2:支持对 Cloudflare R2 存储进行签名请求,使其易于与 Cloudflare 的对象存储解决方案集成。

贡献

欢迎贡献!请提交问题或拉取请求以帮助改进此库。

您的支持将有助于该库的持续开发、维护以及添加新功能。谢谢!

许可证

本库采用MIT许可证。有关详细信息,请参阅LICENSE文件。

致谢

  • 基于AWS Signature Version 4签名过程
  • 受到其他语言中类似库的启发

依赖项

~6–17MB
~241K SLoC