3个版本

0.1.2 2024年2月23日
0.1.1 2024年2月23日
0.1.0 2024年2月23日

#544 in 数学

自定义许可证

22KB
354

RustMacaroon

docs.rs | crates.io | github.com

License: BSD 3-clause Latest release Github issue counter

<>Rusty Macaroons!</>


这是Google为去中心化或分布式授权而开发的“Macaroon”身份验证令牌的Rust实现。Macaroons是一种由Google开发的标准化解决方案。

🙋 Macaroons是什么?

Macaroons是一种新型的载体授权令牌,专为分布式授权而设计。它们通过连接“限制条件”来构建,这些限制条件限制了它们的权限,使它们只能用于特定的用户、组织、项目、交易大小或其他任何您可能想要限制的东西。

这种授权方案具有多个优点。首先,通过链式签名,任何客户端都可以在其令牌上添加新的条件。例如,一个对文件具有读写访问权限的用户可以通过添加只读要求将其共享,并共享访问令牌。

除了正常、本地验证的要求外,macaroons还引入了“第三方限制条件”的概念。这些限制条件不是本地验证,而是由未知服务验证。如果您想了解更多关于其工作原理的信息,我建议您阅读fly.io关于该主题的优秀博客文章

⚡ 开始使用

要生成macaroons,您首先需要定义令牌限制条件的验证逻辑。为此,创建一个实现Caveat的struct

use serde::{Serialize, Deserialize};
use rustmacaroon::Caveat;
use anyhow::anyhow;

#[derive(Serialize, Deserialize)]
struct MyCaveat {
  File {
    filename: String
  },
  Readonly
}

#[derive(Default)]
struct Request {
  filename: String,
  is_write: bool,
}

impl Caveat for MyCaveat {
  type Error = anyhow::Error;
  type Context = Request;

  fn verify(&self, req: &Self::Context) -> Result<(), Self::Error> {
    match self {
      MyCaveat::Readonly if !req.is_write => Ok(()),
      MyCaveat::Filename(f) if req.filename == f => Ok(()),
      _ => Err(anyhow!("Unauthorized!"))
    }
  }
}

现在,您可以使用rustmacaroon开始生成macaroons。Macaroons使用HMAC进行签名,因此rustmacaroon与hamc库集成

use hmac::Hmac;
use sha2::Sha256;

let key = b"mysecretkey";

let macaroon: Macaroon<MyCaveat, Hmac<Sha256>> = Macaroon::new("macaroon id", key);

// Verify the macaroon. This one is always valid.
assert!(macaroon.verify(key, Default::default()).is_ok());

let macaroon = macaroon.attenuate(MyCaveat::Readonly);

assert!(macaroon.verify(key, &Request {
  is_write: true,
  ..Default::default()
}).is_err());

Macaroons的强大功能之一是您可以在客户端对macaroons进行衰减!为此,您只需要在服务器和客户端代码库之间共享Caveat类型(尽管Caveat trait的实现应该位于服务器代码库的新type中;您的客户端不需要授权逻辑)。然后,您可以使用serde解析macaroon并像平常一样进行衰减!

🚧 不支持的功能

Macaroons的另一个强大功能是验证第三方caveats。目前,这个库不提供对第三方caveats的内置支持。然而,如果您的应用程序需要支持它们,完全可以在rustmacaroon之上实现第三方caveats。这个决定的理由很多,但主要原因是它们会显著复杂化API,而且许多面向用户的应用程序实际上并不需要或想要支持它们。

如果有人对支持这个功能表示兴趣,第三方caveats可能会在未来版本中添加,但目前没有这样的计划。


版权 © 2024 – Jake Sarjeant

依赖项

~3.5–5.5MB
~103K SLoC