Rust密码管理工具Bitwarden身份认证库bitwarden-api-identity的使用,实现安全身份验证和API集成

以下是基于提供的Bitwarden身份认证库bitwarden-api-identity的完整示例代码,包含用户注册、登录和验证的全流程:

完整示例代码

use bitwarden_api_identity::{
    apis::{
        accounts_api::{
            accounts_prelogin_post, accounts_register_post, accounts_register_finish_post,
            accounts_register_send_verification_email_post,
        },
        configuration,
    },
    models::{
        PreloginRequestModel, RegisterRequestModel, RegisterFinishRequestModel,
        RegisterSendVerificationEmailRequestModel,
    },
};

#[tokio::main]
async fn main() {
    // 1. 配置API客户端
    let mut config = configuration::Configuration::new();
    config.base_path = "http://localhost".to_string();

    // 2. 预登录流程 - 获取KDF参数
    let email = "user@example.com".to_string();
    let prelogin_request = PreloginRequestModel { email: email.clone() };

    let kdf_params = match accounts_prelogin_post(&config, prelogin_request).await {
        Ok(response) => {
            println!("预登录成功,KDF参数: {:?}", response);
            response
        }
        Err(e) => {
            eprintln!("预登录失败: {:?}", e);
            return;
        }
    };

    // 3. 用户注册流程
    let register_request = RegisterRequestModel {
        email: email.clone(),
        name: "Test User".to_string(),
        master_password_hash: "hashed_password".to_string(),
        master_password_hint: None,
        key: "master_key_hash".to_string(),
        keys: None,
        kdf: kdf_params.kdf,
        kdf_iterations: kdf_params.kdf_iterations,
        kdf_memory: kdf_params.kdf_memory,
        kdf_parallelism: kdf_params.kdf_parallelism,
    };

    let register_response = match accounts_register_post(&config, register_request).await {
        Ok(response) => {
            println!("注册请求成功: {:?}", response);
            response
        }
        Err(e) => {
            eprintln!("注册请求失败: {:?}", e);
            return;
        }
    };

    // 4. 发送验证邮件
    let verification_email_request = RegisterSendVerificationEmailRequestModel {
        email: email.clone(),
    };

    match accounts_register_send_verification_email_post(&config, verification_email_request).await {
        Ok(_) => println!("验证邮件已发送"),
        Err(e) => eprintln!("发送验证邮件失败: {:?}", e),
    }

    // 5. 完成注册流程
    let finish_request = RegisterFinishRequestModel {
        token: register_response.token.clone(),
        encrypted_user_key: "encrypted_user_key_data".to_string(),
        key: "master_key_hash".to_string(),
        keys: None,
        kdf: kdf_params.kdf,
        kdf_iterations: kdf_params.kdf_iterations,
        kdf_memory: kdf_params.kdf_memory,
        kdf_parallelism: kdf_params.kdf_parallelism,
    };

    match accounts_register_finish_post(&config, finish_request).await {
        Ok(response) => println!("注册完成: {:?}", response),
        Err(e) => eprintln!("注册完成失败: {:?}", e),
    }
}

代码说明

  1. 配置API客户端

    • 设置基础路径为本地开发服务器
  2. 预登录流程

    • 获取密钥派生函数(KDF)参数,用于后续密码加密
  3. 用户注册

    • 构建注册请求,包含用户邮箱、名称和主密码哈希
    • 使用从预登录获取的KDF参数
  4. 邮件验证

    • 发送验证邮件到用户邮箱
  5. 完成注册

    • 使用注册令牌完成最终注册流程
    • 提交加密的用户密钥和主密钥哈希

关键注意事项

  • 在实际应用中,需要实现密码哈希和加密逻辑
  • 邮箱验证是可选步骤,但推荐实现以增强安全性
  • KDF参数应根据服务器响应动态设置
  • 所有敏感数据(如密码)应在客户端加密后再传输

要运行此示例,请确保已正确安装bitwarden-api-identity库,并按照前面的安装说明配置好项目依赖。


1 回复

Rust密码管理工具Bitwarden身份认证库bitwarden-api-identity使用指南

概述

bitwarden-api-identity是Bitwarden密码管理工具的身份认证库,提供了与Bitwarden服务器进行身份验证和API集成的功能。这个Rust库允许开发者实现安全的用户认证流程,并与Bitwarden生态系统集成。

主要功能

  1. 用户注册和登录流程
  2. 双因素认证支持
  3. API密钥管理
  4. 安全令牌生成和验证
  5. 与Bitwarden服务器的通信

安装

在Cargo.toml中添加依赖:

[dependencies]
bitwarden-api-identity = "0.3.0"

基本使用方法

1. 初始化客户端

use bitwarden_api_identity::{
    client::IdentityClient,
    config::IdentityConfig,
    error::Result,
};

#[tokio::main]
async fn main() -> Result<()> {
    let config = IdentityConfig {
        identity_url: "https://identity.bitwarden.com".to_string(),
        ..Default::default()
    };
    
    let client = IdentityClient::new(config);
    
    // 使用客户端...
    Ok(())
}

2. 用户登录

async fn login(client: &IdentityClient, email: &str, password: &str) -> Result<()> {
    let response = client
        .login(email, password, None, None, None, None)
        .await?;
    
    println!("登录成功! Access token: {:?}", response.access_token);
    Ok(())
}

3. 处理双因素认证

async fn handle_2fa(client: &IdentityClient, email: &str, token: &str) -> Result<()> {
    let response = client
        .two_factor(email, token, None)
        .await?;
    
    println!("2FA验证成功! Access token: {:?}", response.access_token);
    Ok(())
}

4. 刷新访问令牌

async fn refresh_token(client: &IdentityClient, refresh_token: &str) -> Result<()> {
    let response = client
        .refresh_token(refresh_token)
        .await?;
    
    println!("令牌刷新成功! 新access token: {:?}", response.access_token);
    Ok(())
}

高级用法

自定义API端点

let config = IdentityConfig {
    identity_url: "https://your-custom-bitwarden-instance.com".to_string(),
    api_url: "https://api.your-custom-bitwarden-instance.com".to_string(),
    ..Default::default()
};

错误处理

match client.login("user@example.com", "password", None, None, None, None).await {
    Ok(response) => {
        println!("登录成功!");
    },
    Err(bitwarden_api_identity::error::Error::ApiError { status, error }) => {
        eprintln!("API错误: 状态码 {}, 错误: {:?}", status, error);
    },
    Err(e) => {
        eprintln!("其他错误: {:?}", e);
    }
}

安全注意事项

  1. 永远不要在客户端存储明文密码
  2. 妥善保管访问令牌和刷新令牌
  3. 使用HTTPS进行所有通信
  4. 定期轮换API密钥
  5. 实现适当的令牌过期策略

完整示例

use bitwarden_api_identity::{
    client::IdentityClient,
    config::IdentityConfig,
    error::Result,
};

#[tokio::main]
async fn main() -> Result<()> {
    // 初始化客户端
    let config = IdentityConfig {
        identity_url: "https://identity.bitwarden.com".to_string(),
        ..Default::default()
    };
    let client = IdentityClient::new(config);
    
    // 用户登录
    let email = "user@example.com";
    let password = "secure_password_123";
    
    match client.login(email, password, None, None, None, None).await {
        Ok(response) => {
            println!("登录成功!");
            println!("Access Token: {}", response.access_token);
            println!("Refresh Token: {}", response.refresh_token.unwrap_or_default());
            
            // 使用刷新令牌获取新的访问令牌
            if let Some(refresh_token) = response.refresh_token {
                let refresh_response = client.refresh_token(&refresh_token).await?;
                println!("新Access Token: {}", refresh_response.access_token);
            }
        },
        Err(bitwarden_api_identity::error::Error::ApiError { status: 400, .. }) => {
            println!("可能需要双因素认证...");
            // 这里可以添加2FA处理逻辑
        },
        Err(e) => {
            eprintln!("登录失败: {:?}", e);
        }
    }
    
    Ok(())
}

通过bitwarden-api-identity库,开发者可以轻松地将Bitwarden的强大身份验证功能集成到自己的Rust应用中,同时确保符合最佳安全实践。

回到顶部