Skip to main content

futucli/cmd/
machine.rs

1//! `futucli machine-id`: 打印本机的 machine-id / 指纹(给"跨机器授权"场景用)
2//!
3//! 两种输出:
4//! - 不加 `--for-key`:打印原始 machine-id(便于用户手动确认)
5//! - 加 `--for-key <id>`:打印针对该 key_id 计算出的指纹(可复制到另一台发 key 的机器,
6//!   用 `--bind-machines` 写进 keys.json)
7//!
8//! 这样可以在不把"目标机器的 keys.json / 明文 key"拷过去的前提下,让目标机器"被允许"
9//! 使用某 key — 签发者只需要目标机器的指纹。
10
11use anyhow::{Context, Result};
12use futu_auth::machine;
13
14pub async fn run(for_key: Option<String>) -> Result<()> {
15    let raw = machine::raw_machine_id().context("read machine id")?;
16    match for_key {
17        None => {
18            println!("machine-id (raw): {raw}");
19            println!();
20            println!("To compute a key-specific fingerprint for binding:");
21            println!("  futucli machine-id --for-key REPLACE_WITH_KEY_ID");
22            println!(
23                "  # ⚠️  把 REPLACE_WITH_KEY_ID 换成 `futucli list-keys` 里某把 key 的 id 字段"
24            );
25        }
26        Some(id) => {
27            let fp = machine::fingerprint_from_raw(&id, &raw);
28            println!("fingerprint (for key_id={id:?}):");
29            println!("  {fp}");
30            println!();
31            println!("To bind this machine when generating a key elsewhere:");
32            println!("  futucli gen-key --id {id} --scopes SCOPE1,SCOPE2 --bind-machines {fp}");
33            println!(
34                "  # ⚠️  --scopes 按需替换为真实 scope 列表(qot:read / acc:read / trade:unlock / trade:real / admin)"
35            );
36        }
37    }
38    Ok(())
39}