9个重大版本发布

0.10.0 2023年10月2日
0.9.0 2023年5月2日
0.8.0 2023年3月30日
0.6.0 2022年10月18日
0.1.0 2019年11月6日

#139身份验证

每月27次下载

MIT/Apache

100KB
1K SLoC

最小的JSON Web Token

一个最小的JSON Web Token库。

JSON Web Tokens是一种在双方之间表示声明的机制。

它们在具有第三方提供者的身份验证流程(例如,使用...登录)以及其他场景中使用。

此crate提供对JWT签名和验证签名的功能。

文档

密码学特性/依赖关系

此crate依赖于其他crate进行所有密码学操作。以下是一个支持的crypto crate列表,它支持所需的算法。

依赖的crate 支持的算法 特性
p256 ES256 p256
ring ES256, HS256, RS256 ring
rsa, sha2, signature RS256 rsa, sha2, signature

例如,如果您需要ES256支持,您可以选择使用p256 crate和/或ring crate。假设您选择了p256 crate。在您的crate中,在Cargo.toml中依赖此crate以及相关的依赖crate。

[dependencies]
min_jwt = { version = "0.10.0", features = [ "p256", "serde", "serde_json"] }
p256 = { version = "0.13.0", features = [ "ecdsa", "jwk", "pem"] }

请确保启用相关特性。

在选择密码学实现时,您可能需要考虑与您的环境的兼容性,导入签名和验证密钥的能力以及代码的安全属性(例如,经过审计的实现、抵抗时序攻击等)。

用法

此crate的主要功能是[encode_and_sign]和[verify][fn@verify]函数。

要使用这些函数,构造加密crate的密钥。加密crate可能提供将密钥导入PKCS8 PEM、PKCS8 DER、JSON Web Key (JWK)和其他格式的功能。

然后,使用密钥作为 sign::Signerverify::Verifier 参数。密钥可能需要用提供的类型包装。有关更多文档和示例,请参阅 [sign] 或 [verify][mod@verify] 模块。

示例

使用 p256 crate 通过 ES256 进行签名

# #[cfg(feature = "p256")]
# {
let header = "{\"alg\":\"ES256\",\"typ\":\"JWT\"}";
let claims = "{\"sub\":\"1234567890\",\"name\":\"Jane Doe\",\"iat\":1516239022}";
let jwk = r#"
{
    "kty": "EC",
    "crv": "P-256",
    "x": "erEk-zqoG1oYBLD3ohuz0tzIlU7XzFG1098HcCOu0Ck",
    "y": "lQLKfGS2F6mA97bOvo9AlfyNsn88Mf6Iwa5vmf6UkJw",
    "d": "8UmkmK0KO64KCDRZb4RCAHRZ0AfRWBn3Pv6hTv1VR9k"
}
"#;

let secret_key = ::p256::SecretKey::from_jwk_str(jwk).unwrap();
let signing_key = ::p256::ecdsa::SigningKey::from(secret_key);

let jwt = min_jwt::encode_and_sign(header.as_bytes(), claims.as_bytes(), &signing_key)?;
# assert_eq!(
# "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZ\
# SI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.t2IAtoWoX5iMaIXJmOELc_LY-B8Y\
# xlsgkCsEKso_qvYgg0DR6_Q1pZO6SVeOTLFhgDFku9l_cIoL1A6js5rhjw",
# jwt);
# }
# Ok::<(), min_jwt::Error>(())

使用 rsasha2signature crate 通过 RS256 进行验证

# #[cfg(all(feature = "rsa", feature = "sha2", feature = "signature"))]
# {
# let jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.\
# eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.\
# BV5tgihZQo_CCSJuwSmespFnUPVcE1tZ52td6wYfB6j-YuKanRuHD4hJZPO-fN2GYe492aU4FDF\
# VqVqC3cZcv5sZgkZolPgAhXVlQymw___vmvcodWv7xLjZBr4INpzb4FPUkaNhAd1LvF28CXHx0a\
# NvoyyOo4i_AR1ZYBk6CbsCrVj7XxdsVmP3VBpXLSFKcit0FrWBs_sP0-g2qQDIKZ5w9HNiv4H3f\
# U5NZ_TNKRKIQkwMJ1hvI_JbacIZ9uk2oYZ6LwV_NMeh0EqIwRg1EsH6TcdXhzLRozVa1fbej9hd2\
# -AOGxZTba3LQtBAEKbyEATd7N5mqtEsRvcTHzXJmw";
use ::rsa::pkcs8::DecodePublicKey;

let public_key =
"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyfEiSb2ElqylyAfWkbV0
JmKwzaYH2JtWi05dELrGpSI+OM2mNmFnpxZVUUx77GWASD+u/EbDpB7TxoL8wW6r
SFuduTIb63uhqeilkj6VhpPXVLpZg6m8korAXPGaN5BBMTyBAbpWk9e72z5gOGaF
GI4xOv0v3N0MX2h9uXJvhPTpOdKn6jXEflUFF89OWGEh/3JnyZbX5p8+F8BAuseb
8gfpqT2Ct6KT5GrNiA7dPwjN7XFvVnvyYgR7+QXTVNRMrcrEUoJbR4DG+QVeyIRh
0JGqXtm901cviPBRbicIMn2f8qfs15XMSeHWrgel21Cv1wQh3I4xy+soZuZZ2i/p
zwIDAQAB
-----END PUBLIC KEY-----";

let public_key = ::rsa::RsaPublicKey::from_public_key_pem(public_key).unwrap();
let verifying_key = ::rsa::pkcs1v15::VerifyingKey::new_with_prefix(public_key);

let result = min_jwt::verify(jwt, &verifying_key)?;

let header = result.decode_header();
let claims = result.decode_claims();
# }
# Ok::<(), min_jwt::Error>(())

许可证

根据您的选择,受 Apache License, Version 2.0MIT License 许可。

贡献

除非您明确声明,否则您提交给包含在作品中的任何有意贡献,根据 Apache-2.0 许可定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~0–10MB
~108K SLoC