Rust Web机器人认证库web-bot-auth的使用:轻量级安全认证与自动化身份验证解决方案

Rust Web机器人认证库web-bot-auth的使用:轻量级安全认证与自动化身份验证解决方案

web-bot-auth是一个纯Rust实现的Web机器人认证库,基于draft-meunier-web-bot-auth-architecture规范定义。

特性

  • 即插即用的HTTP消息签名支持:通过实现UnsignedMessage/SignedMessage特质,为任意HTTP消息生成和验证签名,独立于框架或库
  • 开箱即用的支持,专门用于验证和生成安全的web-bot-auth签名

使用

签名消息

以下是签名消息的示例代码:

use web_bot_auth::{signing::*, Message};

// 创建一个HTTP消息
let message = Message::builder()
    .method("GET")
    .uri("/api/v1/users")
    .header("Host", "example.com")
    .body(Vec::new())
    .unwrap();

// 生成密钥对
let key_pair = KeyPair::generate();

// 签名消息
let signed_message = message.sign(&key_pair, "web-bot-auth").unwrap();

// 获取签名头和签名输入头
let signature_header = signed_message.signature_header();
let signature_input_header = signed_message.signature_input_header();

验证Web Bot Auth消息

以下是验证消息的示例代码:

use web_bot_auth::{verification::*, Message};

// 创建一个已签名的HTTP消息
let signed_message = /* 从请求中获取已签名的消息 */;

// 获取公钥(实际应用中应从可信来源获取)
let public_key = /* 获取发送者的公钥 */;

// 验证消息
let verification_result = signed_message.verify(&public_key, "web-bot-auth");

match verification_result {
    Ok(_) => println!("验证成功"),
    Err(e) => println!("验证失败: {}", e),
}

验证任意消息签名

以下是验证任意消息签名的示例代码:

use web_bot_auth::{verification::*, Message};

// 创建一个已签名的HTTP消息(不一定是web-bot-auth签名)
let signed_message = /* 从请求中获取已签名的消息 */;

// 获取公钥
let public_key = /* 获取发送者的公钥 */;

// 获取签名标签(从Signature-Input头中提取)
let tag = /* 提取签名标签 */;

// 验证消息
let verification_result = signed_message.verify(&public_key, tag);

match verification_result {
    Ok(_) => println!("验证成功"),
    Err(e) => println!("验证失败: {}", e),
}

安全注意事项

该软件尚未经过审计,请自行决定是否使用。

许可证

该项目采用Apache-2.0许可证。

完整示例

以下是一个完整的Web Bot Auth使用示例,包含签名和验证过程:

use web_bot_auth::{signing::*, verification::*, Message};

fn main() {
    // 1. 发送方准备消息并签名
    let original_message = Message::builder()
        .method("POST")
        .uri("/api/data")
        .header("Host", "api.example.com")
        .header("Content-Type", "application/json")
        .body(br#"{"action":"update","value":42}"#.to_vec())
        .unwrap();
    
    // 生成密钥对
    let key_pair = KeyPair::generate();
    
    // 签名消息
    let signed_message = original_message.sign(&key_pair, "web-bot-auth").unwrap();
    
    // 2. 接收方验证消息
    // 假设我们通过网络传输了signed_message,现在接收方获取到它
    
    // 获取公钥(在实际应用中,应从可信来源获取发送方的公钥)
    let public_key = key_pair.public_key();
    
    // 验证消息
    match signed_message.verify(&public_key, "web-bot-auth") {
        Ok(_) => {
            println!("验证成功!");
            // 可以安全地处理消息内容
            println!("消息体: {:?}", String::from_utf8_lossy(signed_message.body()));
        }
        Err(e) => {
            println!("验证失败: {}", e);
            // 应该拒绝处理该消息
        }
    }
}

安装

在您的项目目录中运行以下Cargo命令:

cargo add web-bot-auth

或者在Cargo.toml中添加以下行:

web-bot-auth = "0.5.0"

1 回复

Rust Web机器人认证库web-bot-auth使用指南

概述

web-bot-auth是一个轻量级的Rust库,专门为Web机器人/自动化脚本提供安全认证解决方案。它简化了自动化身份验证流程,同时保持了高度的安全性。

主要特性

  • 轻量级设计,最小化依赖
  • 支持多种认证方式(OAuth2.0、Basic Auth等)
  • 自动化令牌管理和刷新
  • 防止常见安全漏洞(CSRF、重放攻击等)
  • 易于集成的API设计

安装

在Cargo.toml中添加依赖:

[dependencies]
web-bot-auth = "0.3.0"

基本使用方法

1. 创建认证客户端

use web_bot_auth::{AuthClient, AuthConfig};

let config = AuthConfig::builder()
    .client_id("your_client_id")
    .client_secret("your_client_secret")
    .redirect_uri("https://your-redirect-uri.com/callback")
    .build();

let auth_client = AuthClient::new(config);

2. OAuth2.0认证流程

// 获取授权URL
let auth_url = auth_client.get_authorization_url("state_token");

// 在用户授权后,用code交换令牌
let token = auth_client.exchange_code("authorization_code").await?;

// 使用令牌访问受保护资源
let response = auth_client
    .authenticated_request("GET", "https://api.example.com/data")
    .await?;

3. Basic认证

use web_bot_auth::BasicAuth;

let basic_auth = BasicAuth::new("username", "password");
let response = basic_auth.request("GET", "https://api.example.com/protected").await?;

高级功能

令牌自动刷新

// 配置自动刷新
let config = AuthConfig::builder()
    // ...其他配置
    .auto_refresh(true)
    .refresh_threshold_seconds(300) // 在令牌过期前5分钟刷新
    .build();

// 客户端会自动处理令牌刷新

自定义认证存储

use web_bot_auth::AuthStorage;

struct CustomStorage;
impl AuthStorage for CustomStorage {
    // 实现存储接口
}

let auth_client = AuthClient::with_storage(config, CustomStorage);

安全实践

  1. 始终使用HTTPS
  2. 妥善保管client_secret
  3. 实现适当的错误处理
  4. 定期轮换凭据

示例:完整的GitHub机器人认证

use web_bot_auth::{AuthClient, AuthConfig};
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = AuthConfig::github()
        .client_id("your_github_client_id")
        .client_secret("your_github_client_secret")
        .redirect_uri("http://localhost:8080/callback")
        .build();

    let auth_client = AuthClient::new(config);
    
    // 1. 获取授权URL并引导用户访问
    let auth_url = auth_client.get_authorization_url("random_state");
    println!("请访问此URL授权: {}", auth_url);
    
    // 2. 在回调中获取code后交换令牌
    // 模拟获取到的code
    let code = "user_provided_code";
    let token = auth_client.exchange_code(code).await?;
    
    // 3. 使用令牌访问API
    let repos: Value = auth_client
        .authenticated_request("GET", "https://api.github.com/user/repos")
        .await?
        .json()
        .await?;
    
    println!("用户仓库: {:?}", repos);
    Ok(())
}

故障排除

  • 认证失败:检查凭据和重定向URI
  • 令牌过期:确保自动刷新已启用
  • 速率限制:实现适当的退避策略

完整示例代码

下面是一个完整的Twitter机器人认证示例:

use web_bot_auth::{AuthClient, AuthConfig};
use serde_json::Value;
use std::env;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 从环境变量获取配置
    let client_id = env::var("TWITTER_CLIENT_ID").expect("TWITTER_CLIENT_ID not set");
    let client_secret = env::var("TWITTER_CLIENT_SECRET").expect("TWITTER_CLIENT_SECRET not set");
    
    // 创建Twitter认证配置
    let config = AuthConfig::twitter()
        .client_id(&client_id)
        .client_secret(&client_secret)
        .redirect_uri("http://localhost:8080/callback")
        .build();

    let auth_client = AuthClient::new(config);
    
    // 1. 获取授权URL
    let auth_url = auth_client.get_authorization_url("twitter_state");
    println!("请访问此URL授权: {}", auth_url);
    
    // 2. 模拟用户授权后获取code
    println!("请输入回调中的code:");
    let mut code = String::new();
    std::io::stdin().read_line(&mut code)?;
    let code = code.trim();
    
    // 3. 交换访问令牌
    let token = auth_client.exchange_code(code).await?;
    println!("成功获取访问令牌: {:?}", token);
    
    // 4. 获取用户信息
    let user_info: Value = auth_client
        .authenticated_request("GET", "https://api.twitter.com/2/users/me")
        .await?
        .json()
        .await?;
    
    println!("用户信息: {:#?}", user_info);
    
    // 5. 发送推文
    let tweet = serde_json::json!({
        "text": "这是通过web-bot-auth库发送的推文!"
    });
    
    let _ = auth_client
        .authenticated_request("POST", "https://api.twitter.com/2/tweets")
        .json(&tweet)
        .send()
        .await?;
    
    println!("推文发送成功!");
    Ok(())
}

这个完整示例展示了:

  1. 从环境变量安全获取凭据
  2. 创建Twitter专用的认证配置
  3. 完整的OAuth2.0授权流程
  4. 获取用户信息
  5. 发送认证API请求

使用前请确保:

  1. 已注册Twitter开发者应用
  2. 设置好正确的回调URI
  3. 安装了所需依赖(tokio, serde_json等)
回到顶部