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

jwt-simple-jwks

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

1 个不稳定版本

0.3.0 2024年2月20日

#1414 in Web编程

每月下载 29

MIT 许可证

34KB
553

jwt-simple-jwks

Docs Crates.io Build Status License:MIT License:Apache Minimum rustc version

jwt-simple-jwks 是一个用 Rust 编写的库,用于使用 JSON Web 密钥存储(JWKS)解码和验证 JWT 令牌。

此 JWKS 客户端仅与 jwt-simple 兼容。

安装

[dependencies]
jwt-simple-jwks = "0.3"

特性

JWKS 密钥存储

  • 从HTTP地址下载密钥集
  • 将JWT令牌解码为头部、有效载荷和签名
  • 验证令牌签名、过期时间和未开始时间
  • 确定何时应该刷新密钥
  • 无panic!

JWT

  • 使用 jwt-simple 包提供RSA密钥的解码功能。

基本用法

以下示例演示了如何从HTTP地址加载一组密钥并使用这些密钥验证JWT令牌

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let jkws_url = "https://raw.githubusercontent.com/seanpianka/jwks-client/0.1.8/test/test-jwks.json";

    let key_set = KeyStore::new_from(jkws_url.to_owned()).await.unwrap();

    // ...

    let token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEifQ.eyJuYW1lIjoiQWRhIExvdmVsYWNlIiwiaXNzIjoiaHR0cHM6Ly9jaHJvbm9nZWFycy5jb20vdGVzdCIsImF1ZCI6InRlc3QiLCJhdXRoX3RpbWUiOjEwMCwidXNlcl9pZCI6InVpZDEyMyIsInN1YiI6InNidTEyMyIsImlhdCI6MjAwLCJleHAiOjUwMCwibmJmIjozMDAsImVtYWlsIjoiYWxvdmVsYWNlQGNocm9ub2dlYXJzLmNvbSJ9.eTQnwXrri_uY55fS4IygseBzzbosDM1hP153EZXzNlLH5s29kdlGt2mL_KIjYmQa8hmptt9RwKJHBtw6l4KFHvIcuif86Ix-iI2fCpqNnKyGZfgERV51NXk1THkgWj0GQB6X5cvOoFIdHa9XvgPl_rVmzXSUYDgkhd2t01FOjQeeT6OL2d9KdlQHJqAsvvKVc3wnaYYoSqv2z0IluvK93Tk1dUBU2yWXH34nX3GAVGvIoFoNRiiFfZwFlnz78G0b2fQV7B5g5F8XlNRdD1xmVZXU8X2-xh9LqRpnEakdhecciFHg0u6AyC4c00rlo_HBb69wlXajQ3R4y26Kpxn7HA";

    #[derive(Serialize, Deserialize, Debug)]
    pub struct CustomClaims {
        auth_time: i64,
        name: String,
        user_id: String,
        email: String,
    }

    let validation = jwt_simple::prelude::VerificationOptions {
        allowed_issuers: Some(HashSet::from(["https://chronogears.com/test".to_owned()])),
        ..Default::default()
    };

    match key_set.verify::<CustomClaims>(token, Some(validation)) {
        Ok(claims) => {
            println!("iss={}", claims.issuer.unwrap());
            println!("name={}", claims.custom.name);
        }
        Err(Error { msg, typ }) => {
            eprintln!("Could not verify token. Reason: {} {:?}", msg, typ);
        }
    }
    Ok(())
}

作者注

用 ❤️ 在 Rust 中制作

依赖项

~16–33MB
~608K SLoC