#jwt #pki #authorization #authz

ucan

以简洁和便捷的方式实现基于UCAN的授权!

18个版本

0.7.0-alpha.12022年10月4日
0.6.0-alpha.12022年5月19日
0.5.0-alpha.62022年4月1日
0.5.0-alpha.52022年3月31日
0.1.0 2022年11月29日

#1494 in 加密学

Download history 868/week @ 2024-03-11 314/week @ 2024-03-18 335/week @ 2024-03-25 372/week @ 2024-04-01 89/week @ 2024-04-08 173/week @ 2024-04-15 114/week @ 2024-04-22 396/week @ 2024-04-29 102/week @ 2024-05-06 270/week @ 2024-05-13 79/week @ 2024-05-20 155/week @ 2024-05-27 75/week @ 2024-06-03 55/week @ 2024-06-10 78/week @ 2024-06-17 167/week @ 2024-06-24

每月377次下载
用于20个crate(14个直接使用)

Apache-2.0

105KB
2.5K SLoC

这是Rust核心UCAN实现。

请参阅https://docs.rs/ucan以获取文档。


lib.rs:

以简洁和便捷的方式实现基于UCAN的授权!

UCANs是基于JSON Web Tokens(简称JWT)的新兴模式,用于在Web应用程序中简化分布式和/或去中心化的授权流程。访问https://ucan.xyz了解UCANs的介绍以及如何在您的应用程序中使用它们。

示例

该crate提供builder::UcanBuilder抽象,用于生成签名的UCAN令牌。

要生成一个签名的令牌,您需要提供一个crypto::SigningKey实现。有关提供签名键的更多信息,请参阅crypto模块文档。

use ucan::{
  builder::UcanBuilder,
  crypto::KeyMaterial,
};

async fn generate_token<'a, K: KeyMaterial>(issuer_key: &'a K, audience_did: &'a str) -> Result<String, anyhow::Error> {
    UcanBuilder::default()
      .issued_by(issuer_key)
      .for_audience(audience_did)
      .with_lifetime(60)
      .build()?
      .sign().await?
      .encode()
}

该crate还提供了解析器,用于解释UCAN令牌及其发行者/见证证明所授予的能力:chain::ProofChain

大多数能力都与特定应用域紧密相关。请参阅capability模块文档,以了解更多关于定义您自己的特定域语义的信息。

use ucan::{
  chain::{ProofChain, CapabilityInfo},
  capability::{CapabilitySemantics, Scope, Action},
  crypto::did::{DidParser, KeyConstructorSlice},
  store::UcanJwtStore
};

const SUPPORTED_KEY_TYPES: &KeyConstructorSlice = &[
    // You must bring your own key support
];

async fn get_capabilities<'a, Semantics, S, A, Store>(ucan_token: &'a str, semantics: &'a Semantics, store: &'a Store) -> Result<Vec<CapabilityInfo<S, A>>, anyhow::Error>
    where
        Semantics: CapabilitySemantics<S, A>,
        S: Scope,
        A: Action,
        Store: UcanJwtStore
{
    let mut did_parser = DidParser::new(SUPPORTED_KEY_TYPES);

    Ok(ProofChain::try_from_token_string(ucan_token, &mut did_parser, store).await?
        .reduce_capabilities(semantics))
}

请注意,您必须自行提供密钥支持以构建ProofChain,通过crypto::did::DidParser。这样,核心库可以保持对特定密钥类型支持实现的无关性。

依赖项

~9–23MB
~334K SLoC