Rust YubiKey安全认证库yubico的使用,支持硬件密钥管理和双因素身份验证
Rust YubiKey安全认证库yubico的使用,支持硬件密钥管理和双因素身份验证
该库实现了与Yubico验证平台的集成,允许在Rust应用中使用Yubikey的一次性密码,支持用户通过Yubikey进行身份验证。
当前功能
- [x] 同步Yubikey客户端API库,支持验证协议2.0版本
- [x] 基于Tokio的异步Yubikey客户端API库
注意: USB相关功能已移至单独的仓库yubico-manager
使用方式
在Cargo.toml中添加:
[dependencies]
yubico = "0.9"
可选的Cargo特性:
- online-tokio (默认启用):提供与Tokio的集成,使用futures。
可以像下面这样启用或禁用特性:
[dependencies.yubico]
version = "0.9"
# 不包含默认特性(online-tokio)
default-features = false
# 选择特定特性
features = []
使用默认服务器的OTP验证
extern crate yubico;
use yubico::config::*;
use yubico::verify;
fn main() {
let config = Config::default()
.set_client_id("CLIENT_ID")
.set_key("API_KEY");
match verify("OTP", config) {
Ok(answer) => println!("{}", answer),
Err(e) => println!("Error: {}", e),
}
}
使用自定义API服务器的OTP验证
extern crate yubico;
use yubico::verify;
use yubico::config::*;
fn main() {
let config = Config::default()
.set_client_id("CLIENT_ID")
.set_key("API_KEY")
.set_api_hosts(vec!["https://api.example.com/verify".into()]);
match verify("OTP", config) {
Ok(answer) => println!("{}", answer),
Err(e) => println!("Error: {}", e),
}
}
异步OTP验证
#![recursion_limit="128"]
extern crate futures;
extern crate tokio;
extern crate yubico;
use futures::future::Future;
use yubico::verify_async;
extern crate yubico;
use std::io::stdin;
use yubico::config::Config;
fn main() {
println!("Please plug in a yubikey and enter an OTP");
let client_id = std::env::var("YK_CLIENT_ID")
.expect("Please set a value to the YK_CLIENT_ID environment variable.");
let api_key = std::env::var("YK_API_KEY")
.expect("Please set a value to the YK_API_KEY environment variable.");
let otp = read_user_input();
let config = Config::default()
.set_client_id(client_id)
.set_key(api_key);
tokio::run(verify_async(otp, config)
.unwrap()
.map(|_|{
println!("Valid OTP.");
})
.map_err(|err|{
println!("Invalid OTP. Cause: {:?}", err);
}))
}
fn read_user_input() -> String {
let mut buf = String::new();
stdin()
.read_line(&mut buf)
.expect("Could not read user input.");
buf
}
完整示例代码
下面是一个完整的YubiKey双因素认证示例:
use yubico::config::*;
use yubico::verify;
use std::env;
fn main() {
// 从环境变量获取API凭证
let client_id = env::var("YUBICO_CLIENT_ID").expect("YUBICO_CLIENT_ID not set");
let api_key = env::var("YUBICO_API_KEY").expect("YUBICO_API_KEY not set");
// 从用户输入获取OTP
println!("Please enter your YubiKey OTP:");
let mut otp = String::new();
std::io::stdin().read_line(&mut otp).expect("Failed to read input");
let otp = otp.trim();
// 配置验证器
let config = Config::default()
.set_client_id(&client_id)
.set_key(&api_key);
// 执行验证
match verify(otp, config) {
Ok(answer) => {
if answer.status == "OK" {
println!("Authentication successful!");
println!("Identity: {}", answer.identity);
} else {
println!("Authentication failed: {}", answer.status);
}
},
Err(e) => println!("Error verifying OTP: {}", e),
}
}
变更日志
- 0.10.0: 升级到 tokio 1.1 和 reqwest 0.11
- 0.9.2: (已撤回) 依赖更新
- 0.9.1: 设置HTTP代理(基本认证可选)
- 0.9.0: 迁移到 tokio 0.2 和 reqwest 0.10
- 0.9.0-alpha.1: 迁移到 futures 0.3.0-alpha.19
- 0.8: 将 sync 和 async 模块重命名为 sync_verifier 和 async_verifier,以避免使用保留关键字 async
安装
在项目目录中运行以下Cargo命令:
cargo add yubico
或者在Cargo.toml中添加以下行:
yubico = "0.11.0"
1 回复