#key-gen #offline #licensing #sdk #validate #machine #keygen-config

keygen-rs

非官方的 Rust Keygen SDK。集成许可证激活和离线许可证。

1 个不稳定版本

新版本 0.1.0 2024 年 8 月 15 日

#11#licensing

MIT 许可证

66KB
1.5K SLoC

非官方 Keygen Rust SDK

Crates.io Documentation

keygen-rs 包允许 Rust 程序使用 keygen.sh 服务进行许可。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
keygen-rs = "0.1.0"

配置

KeygenConfig

使用 KeygenConfig 全局配置 SDK。您应该在调用任何 API 之前设置此配置。

use keygen_rs::config::{self, KeygenConfig};

config::set_config(KeygenConfig {
    api_url: "https://api.keygen.sh".to_string(),
    account: "YOUR_KEYGEN_ACCOUNT_ID".to_string(),
    product: "YOUR_KEYGEN_PRODUCT_ID".to_string(),
    license_key: Some("A_KEYGEN_LICENSE_KEY".to_string()),
    public_key: Some("YOUR_KEYGEN_PUBLIC_KEY".to_string()),
    ..KeygenConfig::default()
});

用法

验证许可证

要验证许可证,请使用您的 Keygen 账户详情配置 KeygenConfig。然后使用设备指纹调用 validate 函数

use keygen_rs::{config::{self, KeygenConfig}, errors::Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    config::set_config(KeygenConfig {
        api_url: "https://api.keygen.sh".to_string(),
        account: "YOUR_KEYGEN_ACCOUNT_ID".to_string(),
        product: "YOUR_KEYGEN_PRODUCT_ID".to_string(),
        license_key: Some("A_KEYGEN_LICENSE_KEY".to_string()),
        public_key: Some("YOUR_KEYGEN_PUBLIC_KEY".to_string()),
        ..KeygenConfig::default()
    });

    let fingerprint = machine_uid::get().unwrap_or("".into());
    let license = keygen_rs::validate(&[fingerprint]).await?;
    println!("License validated successfully: {:?}", license);

    Ok(())
}

激活机器

要为许可证激活机器

use keygen_rs::{config::{self, KeygenConfig}, errors::Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    config::set_config(KeygenConfig {
        // ... (same configuration as above)
    });

    let fingerprint = machine_uid::get().unwrap_or("".into());
    if let Err(err) = keygen_rs::validate(&[fingerprint.clone()]).await {
        match err {
            Error::LicenseNotActivated(license) => {
                let machine = license.activate(&fingerprint, &[]).await?;
                println!("License activated successfully: {:?}", machine);
            },
            _ => {
                println!("License validation failed: {:?}", err);
            }
        }
    } else {
        println!("License already validated successfully");
    }

    Ok(())
}

离线许可证密钥验证

要离线验证已签名的许可证密钥

use keygen_rs::{config::{self, KeygenConfig}, license::SchemeCode};

fn main() {
    config::set_config(KeygenConfig {
        // ... (configuration with public_key set)
    });

    let signed_key = "YOUR_SIGNED_LICENSE_KEY";
    if let Ok(data) = keygen_rs::verify(SchemeCode::Ed25519Sign, signed_key) {
        println!("License verified: {:?}", String::from_utf8_lossy(&data));
    } else {
        println!("License verification failed");
    }
}

错误处理

SDK 返回有意义的错误,您可以在集成中进行处理。以下是一个处理 LicenseNotActivated 错误的示例

use keygen_rs::{config::{self, KeygenConfig}, errors::Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    config::set_config(KeygenConfig {
        // ... (configuration)
    });

    let fingerprint = machine_uid::get().unwrap_or("".into());
    match keygen_rs::validate(&[fingerprint.clone()]).await {
        Ok(license) => println!("License is valid: {:?}", license),
        Err(Error::LicenseNotActivated(license)) => {
            println!("License is not activated. Activating...");
            let machine = license.activate(&fingerprint, &[]).await?;
            println!("Machine activated: {:?}", machine);
        },
        Err(e) => println!("Error: {:?}", e),
    }

    Ok(())
}

示例

有关更详细的示例,请参阅存储库中的 examples 目录。

测试

在实现您的许可集成测试策略时,我们建议模拟 Keygen API 响应。这对于 CI/CD 环境尤为重要,可以防止对 Keygen 服务器的过度负载,并保持您的账户每日请求限制。您可以使用 mockitowiremock 等包在测试中模拟 HTTP 响应。

受以下启发

许可证

本项目采用 MIT 许可证。

依赖项

~13–50MB
~775K SLoC