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次下载
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::Signer 或 verify::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>(())
使用 rsa
、sha2
和 signature
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.0 或 MIT License 许可。
贡献
除非您明确声明,否则您提交给包含在作品中的任何有意贡献,根据 Apache-2.0 许可定义,应按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~0–10MB
~108K SLoC