use broadcast_auth::{Authenticator, Credentials, RequestContext, respond};
fn main() {
let value = respond(
"Basic realm=\"cameras\"",
&RequestContext::new("GET", "/stream/media.m3u8"),
Credentials::new("admin", "hunter2"),
)
.expect("Basic responds to any challenge shape");
println!("[basic] Authorization: {value}");
assert!(value.starts_with("Basic "));
let digest_challenge = "Digest realm=\"cameras\", \
nonce=\"dcd98b7102dd2f0e8b11d0f600bfb0c093\", qop=\"auth\", algorithm=MD5";
let mut auth =
Authenticator::from_challenge(digest_challenge, Credentials::new("admin", "hunter2"))
.expect("challenge parses");
let value = auth
.authorization(&RequestContext::new(
"DESCRIBE",
"rtsp://camera.example.com/live",
))
.expect("computes a Digest Authorization value");
println!("[digest] Authorization: {value}");
assert!(value.starts_with("Digest "));
let second = auth
.authorization(&RequestContext::new(
"DESCRIBE",
"rtsp://camera.example.com/live",
))
.expect("computes a second Digest Authorization value");
assert_ne!(value, second, "nc must advance across requests");
println!("[digest] Authorization (2nd request, nc advanced): {second}");
let value = respond(
"ignored — Bearer needs no challenge round-trip",
&RequestContext::new("GET", "/stream/media.m3u8"),
Credentials::bearer("mytoken123"),
)
.expect("Bearer always responds");
println!("[bearer] Authorization: {value}");
assert_eq!(value, "Bearer mytoken123");
}