13个版本 (3个稳定版本)
1.2.0 | 2022年12月20日 |
---|---|
1.1.0 | 2021年8月15日 |
1.0.0 | 2021年3月23日 |
1.0.0-alpha.13 | 2020年4月12日 |
1.0.0-alpha.8 | 2019年12月21日 |
在Web编程中排名第858
每月下载量6,460
用于 6 crates
75KB
1.5K SLoC
Rust的Json Web Tokens实现
安装
jsonwebtokens = "1"
serde_json = "1"
然后,在你的代码中
use serde_json::json;
use serde_json::value::Value;
use jsonwebtokens as jwt;
use jwt::{Algorithm, AlgorithmID, Verifier};
用法
主要两种类型是Algorithm
和Verifier
。一个Algorithm
封装了一个用于签名或验证令牌的加密函数,而一个Verifier
则处理给定一个Algorithm
的令牌的签名和声明的检查。
独立创建一个Algorithm
可以确保对秘密或密钥的任何解析只需发生一次。
用于描述Verifier
的构建器模式使得代码无论是有简单的还是复杂的验证需求都保持高效。
如果你需要比上述API更多的控制,也可以使用一个低级API(::raw
)来手动分割、解码和验证JWT令牌。
签名令牌
使用对称密钥
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let header = json!({ "alg": alg.name() });
let claims = json!({ "foo": "bar" });
let token = encode(&header, &claims, &alg)?;
如果您的密钥是base64编码的
let alg = Algorithm::new_hmac_b64(AlgorithmID::HS256, secret_data)?;
使用RSA私钥
let alg = Algorithm::new_rsa_pem_signer(AlgorithmID::RS256, pem_data)?;
let header = json!({ "alg": alg.name() });
let claims = json!({ "foo": "bar" });
let token = encode(&header, &claims, &alg)?;
验证令牌
使用对称密钥
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let verifier = Verifier::create()
.issuer("http://some-auth-service.com")
.audience("application_id")
.build()?;
let claims: Value = verifier.verify(&token_str, &alg)?;
使用RSA私钥
let alg = Algorithm::new_rsa_pem_verifier(AlgorithmID::RS256, pem_data)?;
let verifier = Verifier::create()
.issuer("http://some-auth-service.com")
.audience("application_id")
.build()?;
let claims: Value = verifier.verify(&token_str, &alg)?;
验证标准声明
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let verifier = Verifier::create()
.issuer("http://some-auth-service.com")
.audience("application_id")
.subject("subject")
.nonce("9837459873945093845")
.leeway(5) // give this much leeway (in seconds) when validating exp, nbf and iat claims
.build()?;
let claims: Value = verifier.verify(&token_str, &alg)?;
验证自定义声明
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let verifier = Verifier::create()
.string_equals("my_claim0", "value")
.string_matches("my_claim1", Regex::new("value[0-9]").unwrap())
.string_equals_one_of("my_claim2", &["value0", "value1"])
.string_matches_one_of("my_claim3", &[regex0, regex1])
.claim_callback("my_claim4", |v| v.is_u64() && v.as_u64().unwrap() == 1234)
.build()?;
let claims: Value = verifier.verify(&token_str, &alg)?;
验证时间戳(或否)
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let verifier = Verifier::create()
.leeway(5) // give this much leeway when validating exp, nbf and iat claims
.ignore_exp() // ignore expiry
.ignore_nbf() // ignore 'not before time'
.ignore_iat() // ignore issue time
.build()?;
let claims: Value = verifier.verify(&token_str, &alg)?;
低级用法
如果您需要比上述API更细粒度的控制,许多底层细节都通过::raw
模块公开,允许您手动分割、解码和验证JWT令牌。
只需将令牌分割成组件部分
let TokenSlices {message, signature, header, claims } = raw::split_token(token)?;
只需解析头信息
use serde_json::value::Value;
let header: Value = raw::decode_header_only(token);
对头信息或声明进行Base64解码并反序列化JSON
相当于raw::decode_header_only()
let TokenSlices {header, .. } = raw::split_token(token)?;
let header = raw::decode_json_token_slice(header)?;
或者,只解码和反序列化声明
let TokenSlices {claims, .. } = raw::split_token(token)?;
let claims = raw::decode_json_token_slice(claims)?;
手动分割、解码和验证令牌
let alg = Algorithm::new_hmac(AlgorithmID::HS256, "secret")?;
let verifier = Verifier::create()
// snip
.build()?;
let TokenSlices {message, signature, header, claims } = raw::split_token(token)?;
let header = raw::decode_json_token_slice(header)?;
raw::verify_signature_only(&header, message, signature, &alg)?;
let claims = raw::decode_json_token_slice(claims)?;
verifier.verify_claims_only(&claims, time_now)?;
支持的算法
支持算法数组。以下算法目前被支持。
alg 参数值 | 数字签名或MAC算法 |
---|---|
HS256 | 使用SHA-256哈希算法的HMAC |
HS384 | 使用SHA-384哈希算法的HMAC |
HS512 | 使用SHA-512哈希算法的HMAC |
RS256 | 使用SHA-256哈希算法的RSASSA-PKCS1-v1_5 |
RS384 | 使用SHA-384哈希算法的RSASSA-PKCS1-v1_5 |
RS512 | 使用SHA-512哈希算法的RSASSA-PKCS1-v1_5 |
PS256 | 使用SHA-256哈希算法的RSASSA-PSS |
PS384 | 使用SHA-384哈希算法的RSASSA-PSS |
PS512 | 使用SHA-512哈希算法的RSASSA-PSS |
ES256 | 使用P-256曲线和SHA-256哈希算法的ECDSA(仅PKCS#8格式PEM) |
ES384 | 使用P-384曲线和SHA-384哈希算法的ECDSA(仅PKCS#8格式PEM) |
none | 未包含数字签名或MAC值 |
基于
最初这个项目是从对jsonwebtoken(无's)的一些小改动开始的,以满足我在构建jsonwebtokens-cognito时遇到的需求,但随着Algorithm API和可定制的Verifier API的创建,设计和实现最终变得大大不同。
该项目从多个现有的Json Web Token库中借鉴了设计理念。特别是它毫不客气地从node-jsonwebtoken和java-jwt中窃取了想法。
依赖关系
~7–11MB
~288K SLoC