14 个版本 (4 个重大更改)

0.5.0 2022 年 5 月 13 日
0.4.3 2022 年 4 月 28 日
0.3.0 2022 年 4 月 11 日
0.2.0 2022 年 4 月 5 日
0.1.6 2022 年 3 月 25 日

#581 in 认证


用于 jinxapi-github

Apache-2.0

63KB
1K SLoC

authentic

A Rust crate 用于处理 HTTP 调用的认证。文档在 https://docs.rs/authentic/latest/authentic/

认证协议可能需要特定的工作流程,例如调用第三方接口刷新令牌或进行初始请求以获取挑战信息。

使用固定的代码结构,authentic 可以执行每个认证协议所需的必要交互。这允许轻松更改协议。

例如,以下代码使用 reqwest 通过 HTTP Basic 认证访问站点。(有关完整工作示例,请参阅 仓库测试目录)。

// One-time code:
let client = reqwest::blocking::Client::new();

let mut realm_credentials = HashMap::new();
realm_credentials.insert(
    "Fake Realm".into(),
    Arc::new(UsernamePasswordCredential::new("username", "password")),
);
let credential = Arc::new(HttpRealmCredentials::new(realm_credentials));

// Per-request code:
let mut authentication = HttpAuthentication::new(credential);

let response = loop {
    while let Some(auth_step) = authentication.step()? {
        match auth_step {
            AuthenticationStep::Request(request) => {
                let auth_response = client.execute(request);
                authentication.respond(auth_response);
            }
            AuthenticationStep::WaitFor(duration) => {
                std::thread::sleep(duration);
            }
        }
    }

    let response = client
        .get("https://httpbin.org/basic-auth/username/password")
        .with_authentication(&authentication)?
        .send()?;

    if authentication.has_completed(&response)? {
        break response;
    }
};

请求的创建发生在循环内部。首先,通过 step() 允许认证协议执行任何第三方调用。HTTP Basic 认证不使用此功能,但它可用于刷新过期的 OAuth2 访问令牌。

使用标准的 reqwest::RequestBuilder 创建请求,使用新的 with_authentication() 方法修改请求以适应认证协议。对于 HTTP 认证,第一次迭代不对请求进行任何更改。

发送请求并接收响应。对于 HTTP 认证,这返回一个 401 未授权 响应。

has_completed() 方法检查响应是否已准备好返回或认证协议需要重试。对于 HTTP 认证,它读取返回的 www-authenticate 挑战并建立正确的凭据。由于请求需要重试,has_completed() 返回 false 并开始第二次迭代。

在循环的第二次迭代中,with_authentication() 将凭据作为 Authorization 标头添加到请求中。请求被认证,并且响应包含正确的数据。has_completed() 将返回 true,并且循环通过响应退出。

依赖项

~1–18MB
~208K SLoC