12个版本 (7个重大更改)
0.8.0 | 2023年10月12日 |
---|---|
0.8.0-beta.1 | 2023年6月9日 |
0.7.0 | 2023年3月14日 |
0.6.0 | 2022年11月1日 |
0.1.0 | 2019年7月1日 |
#78 in 加密学
12,541次每月下载
用于20个crate(直接使用9个)
180KB
3.5K SLoC
Rust中的紧凑JWT实现
注重类型安全和安全加密原语的极简JSON Web令牌(JWT)实现。
用法
将此添加到您的Crate.toml
[dependencies]
jwt-compact = "0.8.0"
基本令牌生命周期
use chrono::{Duration, Utc};
use jwt_compact::{prelude::*, alg::{Hs256, Hs256Key}};
use serde::{Serialize, Deserialize};
/// Custom claims encoded in the token.
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct CustomClaims {
#[serde(rename = "sub")]
subject: String,
// other fields...
}
// Choose time-related options for token creation / validation.
let time_options = TimeOptions::default();
// Create a symmetric HMAC key, which will be used both to create and verify tokens.
let key = Hs256Key::new(b"super_secret_key_donut_steel");
// Create a token.
let header = Header::empty().with_key_id("my-key");
let claims = Claims::new(CustomClaims { subject: "alice".to_owned() })
.set_duration_and_issuance(&time_options, Duration::hours(1))
.set_not_before(Utc::now());
let token_string = Hs256.token(&header, &claims, &key)?;
println!("token: {token_string}");
// Parse the token.
let token = UntrustedToken::new(&token_string)?;
// Before verifying the token, we might find the key which has signed the token
// using the `Header.key_id` field.
assert_eq!(token.header().key_id.as_deref(), Some("my-key"));
// Validate the token integrity.
let token: Token<CustomClaims> = Hs256.validator(&key).validate(&token)?;
// Validate additional conditions.
token.claims()
.validate_expiration(&time_options)?
.validate_maturity(&time_options)?;
Ok::<_, anyhow::Error>(())
请参阅crate文档以获取更多用法示例。
功能
- 特定算法的签名和验证密钥(即,类型安全)。
- 使用包装类型表达RFC 7518中规定的密钥强度要求。
- 易于扩展以支持新的签名算法。
- 该crate支持更紧凑的CBOR编码声明。
- 基本JWK功能,用于将密钥从可读格式(JSON / YAML / TOML)转换为密钥,并计算密钥指纹。
HS256
、HS384
和HS512
算法通过纯Rustsha2
crate实现。- 该框架支持使用Ed25519椭圆曲线的
EdDSA
算法,以及使用secp256k1椭圆曲线的ES256K
算法。这两种曲线在加密社区中得到广泛应用,并被认为安全性高(对于在标准ES*
算法中使用的椭圆曲线的参数生成存在一些疑问)。 - 通过纯Rust的
p256
框架支持ES256
算法。 - 通过纯Rust的
rsa
框架支持RSA算法(包括RS*
和PS*
)。 - 该框架支持
no_std
模式。已明确测试了No-std支持
和WASM兼容性
。
缺失的功能
- 一些声明(例如,
iss
- 令牌发行者)的内置检查。这是故意的:根据使用场景,这些声明可以有不同的语义,因此可以由不同的数据类型表示(例如,iss
可以是可读的简短ID、十六进制编码的密钥摘要等)。 - 不支持
ES384
和ES512
算法。
替代方案
根据使用场景,可能存在其他可行的替代方案,例如jsonwebtoken
、frank_jwt
或biscuit
(例如,似乎没有一种实现了EdDSA
或ES256K
算法)。
另请参阅
- justwebtoken.io - 使用WASM模块打包的此库的教育性迷你网站。
贡献
欢迎所有贡献!请参阅贡献指南以了解如何参与。
许可
遵循Apache-2.0许可。
除非您明确声明,否则您有意提交到jwt-compact
的所有贡献,根据Apache-2.0许可定义,应按上述方式许可,不得附加任何额外条款或条件。
依赖项
~3–12MB
~130K SLoC