Rust Firebase管理SDK库rs-firebase-admin-sdk的使用,集成Firebase云服务实现高效后端开发

Rust Firebase管理SDK库rs-firebase-admin-sdk的使用,集成Firebase云服务实现高效后端开发

Firebase Admin Rust SDK 使开发者能够从特权环境中访问Firebase服务。该SDK设计时考虑了可扩展性和可靠性,以实现零开销的高性能。

当前支持的功能

  • GCP服务账户
  • 用户和自定义身份验证管理
  • Firebase模拟器集成和管理
  • 使用异步公共证书缓存进行Firebase OIDC令牌和会话Cookie验证

与GCP上的Firebase交互示例

use rs_firebase_admin_sdk::{
    auth::{FirebaseAuthService, UserIdentifiers},
    client::ApiHttpClient,
    App, credentials_provider,
};

// 从环境变量加载GCP服务账户
let gcp_service_account = credentials_provider().await.unwrap();
// 为Firebase应用创建实时(非模拟)上下文
let live_app = App::live(gcp_service_account.into()).await.unwrap();

// 创建Firebase身份验证管理客户端
let auth_admin = live_app.auth();

let user = auth_admin.get_user(
    // 构建筛选条件来查找用户
    UserIdentifiers::builder()
        .with_email("me@email.com".into())
        .build()
)
.await
.expect("Error while fetching user")
.expect("User does not exist");

println!("User id: {}", user.uid);

完整示例代码

下面是一个更完整的示例,展示如何使用rs-firebase-admin-sdk进行用户管理和身份验证:

use rs_firebase_admin_sdk::{
    auth::{FirebaseAuthService, UserIdentifiers, UserToCreate},
    client::ApiHttpClient,
    App, credentials_provider,
};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 1. 初始化Firebase Admin SDK
    let gcp_service_account = credentials_provider().await?;
    let live_app = App::live(gcp_service_account.into()).await?;
    let auth_admin = live_app.auth();

    // 2. 创建新用户
    let new_user = auth_admin.create_user(
        UserToCreate::builder()
            .email("newuser@example.com".into())
            .password("securePassword123".into())
            .display_name("New User".into())
            .build()
    ).await?;

    println!("Created new user with UID: {}", new_user.uid);

    // 3. 获取用户信息
    let user = auth_admin.get_user(
        UserIdentifiers::builder()
            .with_uid(new_user.uid.clone())
            .build()
    )
    .await?
    .expect("User should exist");

    println!("User email: {}", user.email.unwrap_or_default());
    println!("User display name: {}", user.display_name.unwrap_or_default());

    // 4. 更新用户信息
    auth_admin.update_user(
        new_user.uid.clone(),
        UserToCreate::builder()
            .display_name("Updated Name".into())
            .build()
    ).await?;

    // 5. 删除用户
    auth_admin.delete_user(new_user.uid).await?;
    println!("User deleted successfully");

    Ok(())
}

更完整的示例代码

以下是一个扩展的完整示例,包含更多Firebase管理操作:

use rs_firebase_admin_sdk::{
    auth::{FirebaseAuthService, UserIdentifiers, UserToCreate, UserToUpdate},
    client::ApiHttpClient,
    App, credentials_provider,
};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 1. 初始化Firebase应用
    let credentials = credentials_provider().await?;
    let app = App::live(credentials.into()).await?;
    let auth = app.auth();

    // 2. 批量创建测试用户
    for i in 1..=3 {
        let email = format!("user{}@example.com", i);
        let user = auth.create_user(
            UserToCreate::builder()
                .email(email.into())
                .password("password123".into())
                .display_name(format!("Test User {}", i).into())
                .build()
        ).await?;
        println!("Created user: {}", user.uid);
    }

    // 3. 列出所有用户
    println!("\nListing all users:");
    let users = auth.list_users().await?;
    for user in users {
        println!("UID: {}, Email: {}", 
            user.uid, 
            user.email.unwrap_or_default()
        );
    }

    // 4. 批量更新用户
    println!("\nUpdating users:");
    let users = auth.list_users().await?;
    for user in users {
        let updated_user = auth.update_user(
            user.uid.clone(),
            UserToUpdate::builder()
                .display_name("Updated User".into())
                .build()
        ).await?;
        println!("Updated user: {}", updated_user.uid);
    }

    // 5. 批量删除用户
    println!("\nDeleting users:");
    let users = auth.list_users().await?;
    for user in users {
        auth.delete_user(user.uid).await?;
        println!("Deleted user: {}", user.uid);
    }

    Ok(())
}

安装

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

cargo add rs-firebase-admin-sdk

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

rs-firebase-admin-sdk = "2.4.0"

许可证

MIT许可证


1 回复

Rust Firebase管理SDK库rs-firebase-admin-sdk使用指南

rs-firebase-admin-sdk是一个Rust库,用于与Firebase管理API交互,使开发者能够在Rust后端应用中集成Firebase服务。

主要功能

  • Firebase认证管理
  • 实时数据库操作
  • Firestore文档管理
  • 用户管理
  • 自定义令牌生成

安装方法

Cargo.toml中添加依赖:

[dependencies]
rs-firebase-admin-sdk = "0.1"
tokio = { version = "1.0", features = ["full"] }

基本使用方法

1. 初始化SDK

use rs_firebase_admin_sdk::{credentials::Credentials, App};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 从JSON文件加载凭证
    let creds = Credentials::from_file("path/to/serviceAccountKey.json")?;
    
    // 创建Firebase应用实例
    let app = App::initialize(creds)?;
    
    Ok(())
}

2. 用户管理示例

use rs_firebase_admin_sdk::{auth::UserManager, user::UserRecord};

async fn create_user(app: &App) -> Result<UserRecord, Box<dyn std::error::Error>> {
    let user_manager = UserManager::new(app);
    
    let user = user_manager.create_user()
        .email("user@example.com")
        .password("securePassword123")
        .display_name("John Doe")
        .await?;
    
    println!("Created user: {:?}", user.uid);
    Ok(user)
}

3. Firestore操作示例

use rs_f极store_admin_sdk::firestore::{Firestore, Document};

async fn add_to_firestore(app: &App) -> Result<(), Box<dyn std::error::Error>> {
    let firestore = Firestore::new(app);
    
    let doc: Document = firestore.collection("users")
        .document("user123")
        .set_data(serde_json::json!({
            "name": "John",
            "age": 30,
            "email": "john@example.com"
        }))
        .await?;
    
    println!("Document created: {:?}", doc);
    Ok(())
}

4. 实时数据库操作示例

use rs_firebase_admin_sdk::realtime_database::Database;

async fn write_to_database(app: &App) -> Result<(), Box<dyn std::error::Error>> {
    let database = Database::new(app);
    
    database.reference("users/user123")
        .set(serde_json::json!({
            "name": "Jane",
            "age": 25
        }))
        .await?;
    
    Ok(())
}

5. 生成自定义令牌

use rs_firebase_admin_sdk::auth::Auth;

async fn generate_token(app: &App) -> Result<String, Box<dyn std::error::Error>> {
    let auth = Auth::new(app);
    
    let token = auth.create_custom_token("user123", None).await?;
    
    println!("Generated token: {}", token);
    Ok(token)
}

高级用法

批量操作

use rs_firebase_admin_sdk::firestore::Firestore;

async fn batch_write(app: &App) -> Result<(), Box<dyn std::error::Error>> {
    let firestore = Firestore::new(app);
    let batch = firestore.batch();
    
    batch.set(
        firestore.collection("users").document("user1"),
        serde_json::json!({"name": "Alice"})
    );
    
    batch.set(
        firestore.collection("users").document("user2"),
        serde_json::json!({"name": "Bob"})
    );
    
    batch.commit().await?;
    Ok(())
}

监听实时数据库变化

use rs_firebase_admin_sdk::realtime_database::Database;
use futures::StreamExt;

async fn listen_changes(app: &App) -> Result<(), Box<dyn std::error::Error>> {
    let database = Database::new(app);
    let mut stream = database.reference("messages").listen();
    
    while let Some(event) = stream.next().await {
        println!("Database change: {:?}", event);
    }
    
    Ok(())
}

错误处理

use rs_firebase_admin_sdk::errors::FirebaseError;

async fn handle_errors(app: &App) {
    match create_user(app).await {
        Ok(user) => println!("User created: {}", user.uid),
        Err(FirebaseError::AuthError(e)) => eprintln!("Authentication error: {}", e),
        Err(FirebaseError::DatabaseError(e)) => eprintln!("Database error: {}", e),
        Err(e) => eprintln!("Other error: {}", e),
    }
}

注意事项

  1. 确保服务账号JSON文件安全,不要提交到版本控制
  2. 生产环境中应考虑使用环境变量存储凭证
  3. 异步操作需要使用tokio运行时
  4. 大量操作时考虑使用批量写入提高性能

这个SDK为Rust开发者提供了完整的Firebase管理功能,可以轻松构建高效的后端服务。

完整示例代码

以下是一个完整的Firebase管理示例,整合了用户管理、Firestore操作和实时数据库功能:

use rs_firebase_admin_sdk::{
    credentials::Credentials, 
    App, 
    auth::{UserManager, Auth},
    firestore::Firestore,
    realtime_database::Database,
    user::UserRecord
};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 初始化SDK
    let creds = Credentials::from_file("serviceAccountKey.json")?;
    let app = App::initialize(creds)?;
    
    // 2. 用户管理 - 创建用户
    let user = create_user(&app).await?;
    
    // 3. 生成自定义令牌
    let token = generate_token(&app, &user.uid).await?;
    println!("Generated token for {}: {}", user.uid, token);
    
    // 4. Firestore操作 - 添加用户数据
    add_to_firestore(&app, &user.uid).await?;
    
    // 5. 实时数据库操作 - 写入用户数据
    write_to_database(&app, &user.uid).await?;
    
    Ok(())
}

async fn create_user(app: &App) -> Result<UserRecord, Box<dyn std::error::Error>> {
    let user_manager = UserManager::new(app);
    
    let user = user_manager.create_user()
        .email("user@example.com")
        .password("securePassword123")
        .display_name("Example User")
        .await?;
    
    println!("Created user with UID: {}", user.uid);
    Ok(user)
}

async fn generate_token(app: &App, uid: &str) -> Result<String, Box<dyn std::error::Error>> {
    let auth = Auth::new(app);
    let token = auth.create_custom_token(uid, None).await?;
    Ok(token)
}

async fn add_to_firestore(app: &App, uid: &str) -> Result<(), Box<dyn std::error::Error>> {
    let firestore = Firestore::new(app);
    
    firestore.collection("users")
        .document(uid)
        .set_data(json!({
            "name": "Example User",
            "email": "user@example.com",
            "createdAt": chrono::Utc::now().to_rfc3339()
        }))
        .await?;
    
    println!("Added user data to Firestore");
    Ok(())
}

async fn write_to_database(app: &App, uid: &str) -> Result<(), Box<dyn std::error::Error>> {
    let database = Database::new(app);
    
    database.reference(format!("users/{}", uid))
        .set(json!({
            "name": "Example User",
            "lastLogin": chrono::Utc::now().to_rfc3339()
        }))
        .await?;
    
    println!("Wrote user data to Realtime Database");
    Ok(())
}

这个完整示例展示了如何:

  1. 初始化Firebase Admin SDK
  2. 创建新用户
  3. 为该用户生成自定义令牌
  4. 将用户数据写入Firestore
  5. 将用户数据写入实时数据库

要运行此代码,请确保:

  1. 已安装Rust和Cargo
  2. 在项目目录下放置有效的serviceAccountKey.json
  3. 在Cargo.toml中添加了正确的依赖项
回到顶部