#jwt #token #authorization

无需std jwt-compact

注重类型安全和安全加密原语的极简JWT实现

12个版本 (7个重大更改)

0.8.0 2023年10月12日
0.8.0-beta.12023年6月9日
0.7.0 2023年3月14日
0.6.0 2022年11月1日
0.1.0 2019年7月1日

#78 in 加密学

Download history 4634/week @ 2024-03-14 4767/week @ 2024-03-21 4095/week @ 2024-03-28 4408/week @ 2024-04-04 4332/week @ 2024-04-11 5316/week @ 2024-04-18 3591/week @ 2024-04-25 3727/week @ 2024-05-02 3453/week @ 2024-05-09 3557/week @ 2024-05-16 3590/week @ 2024-05-23 3156/week @ 2024-05-30 3553/week @ 2024-06-06 3373/week @ 2024-06-13 2615/week @ 2024-06-20 2540/week @ 2024-06-27

12,541次每月下载
用于20个crate(直接使用9个)

Apache-2.0

180KB
3.5K SLoC

Rust中的紧凑JWT实现

Build Status License: Apache-2.0 rust 1.65+ required no_std supported

文档: Docs.rs crate文档(master)

注重类型安全和安全加密原语的极简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)转换为密钥,并计算密钥指纹
  • HS256HS384HS512算法通过纯Rust sha2 crate实现。
  • 该框架支持使用Ed25519椭圆曲线的EdDSA算法,以及使用secp256k1椭圆曲线的ES256K算法。这两种曲线在加密社区中得到广泛应用,并被认为安全性高(对于在标准ES*算法中使用的椭圆曲线的参数生成存在一些疑问)。
  • 通过纯Rust的p256框架支持ES256算法。
  • 通过纯Rust的rsa框架支持RSA算法(包括RS*PS*)。
  • 该框架支持no_std模式。已明确测试了No-std支持WASM兼容性

缺失的功能

  • 一些声明(例如,iss - 令牌发行者)的内置检查。这是故意的:根据使用场景,这些声明可以有不同的语义,因此可以由不同的数据类型表示(例如,iss可以是可读的简短ID、十六进制编码的密钥摘要等)。
  • 不支持ES384ES512算法。

替代方案

根据使用场景,可能存在其他可行的替代方案,例如jsonwebtokenfrank_jwtbiscuit(例如,似乎没有一种实现了EdDSAES256K算法)。

另请参阅

  • justwebtoken.io - 使用WASM模块打包的此库的教育性迷你网站。

贡献

欢迎所有贡献!请参阅贡献指南以了解如何参与。

许可

遵循Apache-2.0许可

除非您明确声明,否则您有意提交到jwt-compact的所有贡献,根据Apache-2.0许可定义,应按上述方式许可,不得附加任何额外条款或条件。

依赖项

~3–12MB
~130K SLoC