0.1.1 |
|
---|---|
0.1.0 |
|
#16 在 #jwks
33KB
708 行
JWKS客户端库

JWKS-Client是一个用Rust编写的库,用于使用JSON Web密钥存储解码和验证JWT令牌。
我创建这个库是为了专门解码GCP/Firebase JWT,但应可以进行少量或无修改地使用。如需提出对不同JWKS密钥存储的支持,请联系我。
基本用法
以下演示了如何从一个HTTP地址加载一组密钥,并使用这些密钥验证JWT令牌
use jwks::KeyStore;
let jkws_url = "https://...";
let key_store = KeyStore::new_from(jkws_url).unwrap();
// ...
let token = "...";
match key_store.verify(token) {
Ok(jwt) => {
println!("name={}", jwt.payload().get_str("name").unwrap());
}
Err(_) => {
eprintln!("Could not verify token");
}
}
JWKS-Client提供描述性错误结果
use jwks::KeyStore;
use error::{Error, Type};
let jwks_url = "http://...";
let token = "...";
let key_store = KeyStore::new_from(jwks_url).unwrap();
match key_store.verify(token) {
Ok(jwt) => {
println!("name={}", jwt.payload().get_str("name").unwrap());
}
Err(Error { msg, typ: Type::Header }) => {
eprintln!("Problem with header. Message: {}", msg);
}
Err(Error { msg, typ: Type::Payload }) => {
eprintln!("Problem with payload. Message: {}", msg);
}
Err(Error { msg, typ: Type::Signature }) => {
eprintln!("Problem with signature. Message: {}", msg);
}
Err(Error { msg: _, typ: Type::Expired }) => {
eprintln!("Token is expired.");
}
Err(Error { msg: _, typ: Type::Early }) => {
eprintln!("Too early to use token.");
}
Err(e) => {
eprintln!("Something else went wrong. Message {:?}", e);
}
}
JWKS-Client可以将JWT有效载荷解码到结构体中
use jwks::KeyStore;
let key_store = KeyStore::new();
let token = TOKEN;
let jwt = key_store.decode(token).unwrap();
if jwt.expired().unwrap_or(false) {
println!("Sorry, token expired")
} else {
let result = jwt.payload().get_str("name");
match result {
Some(name) => { println!("Welcome, {}!", name); }
None => { println!("Welcome, anonymous"); }
}
}
待办事项
- 更多文档 :P
- 从HTTP请求中提取密钥的过期时间
- 在后台自动刷新密钥
依赖关系
~26MB
~644K SLoC