#jwt #okta #key #verifier #authorization #reqwest-client #cache

okta-jwt-verifier

帮助在Rust中处理Okta的JWT的辅助库

16个不稳定版本 (6个破坏性更新)

0.7.0 2023年7月30日
0.6.1 2023年4月20日
0.5.0 2023年2月8日
0.4.5 2022年11月17日
0.1.1 2021年4月20日

身份验证类别中排名211

MIT/Apache

38KB
382

okta-jwt-verifier

Rust crates.io Docs.rs

该库的目的是帮助验证由Okta签发的访问和ID令牌。有关详细信息,请参阅API文档

最低支持的Rust版本(MSRV)

1.65.0

安装

安装cargo add

cargo add okta-jwt-verifier

示例

最小示例

此示例尝试从提供的Okta授权服务器检索密钥,解码令牌头以识别密钥ID,尝试找到匹配的密钥,尝试解码令牌,并最终尝试反序列化声明。

除非启用了缓存功能,否则此方法将在每次请求时尝试检索密钥。

use okta_jwt_verifier::{Verifier, DefaultClaims};

#[async_std::main]
async fn main() -> anyhow::Result<()> {
    let token = "token";
    let issuer = "https://your.domain/oauth2/default";

    Verifier::new(&issuer)
        .await?
        .verify::<DefaultClaims>(&token)
        .await?;
    Ok(())
}

可选配置

此方法将尝试使用提供的端点检索密钥(默认:"/v1/keys")

use okta_jwt_verifier::{Config, Verifier, DefaultClaims};

#[async_std::main]
async fn main() -> anyhow::Result<()> {
    let token = "token";
    let issuer = "https://your.domain/oauth2/default";
    let config: Config =
            Config { keys_endpoint: Some("/oauth2/v1/keys".to_owned()) };
    Verifier::new_with_config(&issuer, config)
        .await?
        .verify::<DefaultClaims>(&token)
        .await?;
    Ok(())
}

此示例展示了验证的可选配置的使用。

use okta_jwt_verifier::Verifier;
use serde::{Deserialize, Serialize};
use std::collections::HashSet;

// You can provide your own Claims struct or use the provided defaults
// This example matches okta_jwt_verifier::DefaultClaims
#[derive(Serialize, Deserialize)]
pub struct Claims {
    pub iss: String,
    pub sub: String,
    pub scp: Option<Vec<String>>,
    pub cid: Option<String>,
    pub uid: Option<String>,
    pub exp: u64,
    pub iat: u64,
}

let token = "token";
let issuer = "https://your.domain/oauth2/default";
let mut aud = HashSet::new();
aud.insert("api://default");
aud.insert("api://test");

let claims = Verifier::new(&issuer)
    .await?
    // An optional leeway (in seconds) can be provided to account for clock skew (default: 120)
    .leeway(0)
    // Optional audience claims can be provided to validate against
    .audience(aud)
    // Adding a single aud entry without building a HashSet manually
    .add_audience("api://dev")
    // An optional client ID can be provided to match against the cid claim
    .client_id("Bl3hStrINgiD")
    .verify::<Claims>(&token)
    .await?;
dbg!(&claims)

密钥缓存

此示例与基本示例相同,但会缓存密钥到磁盘。需要启用cache-surfcache-reqwest功能(默认禁用)。在当前工作目录中创建一个http-cacache目录,其中将存储缓存文件。

安装cargo add

对于surf

cargo add okta-jwt-verifier --features cache-surf

对于reqwest

cargo add okta-jwt-verifier --no-default-features --features client-reqwest,cache-reqwest

Tide中间件

此示例将基本用法示例实现为tide中间件。

ISSUER="https://your.domain/oauth2/default" cargo run --example tide_middleware_basic

功能

以下功能可用。默认启用client-surf

  • client-surf功能,启用远程请求的surf客户端。默认启用。
  • cache-surf功能,启用使用surf客户端时的磁盘缓存以存储密钥(尊重缓存控制)。默认禁用。
  • client-reqwest功能,启用远程请求的reqwest客户端。默认禁用。
  • cache-reqwest 功能,允许在 reqwest 客户端使用时在磁盘上缓存键(尊重缓存控制)。默认情况下是禁用的。

文档

许可证

许可方式:

任选其一。

贡献

除非你明确声明,否则根据 Apache-2.0 许可证定义,你提交的任何有意包含在作品中的贡献,应按上述方式双重许可,不附加任何额外条款或条件。

依赖

~7–23MB
~397K SLoC