#jwt #jwks #jwk #gcp #set-key #key-set

已删除 shared_jwt

使用JSON Web密钥集(JWKS)验证JWT令牌的库

0.1.1 2019年9月22日
0.1.0 2019年9月22日

#16#jwks

MIT 许可证

33KB
708

JWKS客户端库 构建状态 许可证:MIT

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