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 认证
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