Skip to main content

llm_connector/protocols/common/
auth.rs

1//! Common Authentication Strategies
2
3use std::collections::HashMap;
4
5#[derive(Clone, Debug)]
6pub enum AuthStrategy {
7    None,
8    Bearer {
9        api_key: String,
10    },
11    ApiKeyHeader {
12        api_key: String,
13        header_name: String,
14    },
15}
16
17#[derive(Clone, Debug, Default)]
18pub struct HeaderPolicy {
19    pub headers: Vec<(String, String)>,
20}
21
22#[derive(Clone, Debug, Default)]
23pub struct RequestMetadataPolicy {
24    pub header_overrides: HashMap<String, String>,
25}
26
27pub fn materialize_auth_headers(strategy: &AuthStrategy) -> Vec<(String, String)> {
28    match strategy {
29        AuthStrategy::None => vec![],
30        AuthStrategy::Bearer { api_key } => bearer_auth(api_key),
31        AuthStrategy::ApiKeyHeader {
32            api_key,
33            header_name,
34        } => api_key_header(api_key, header_name),
35    }
36}
37
38pub fn apply_header_policy(
39    mut headers: Vec<(String, String)>,
40    policy: &HeaderPolicy,
41) -> Vec<(String, String)> {
42    headers.extend(policy.headers.clone());
43    headers
44}
45
46pub fn merge_metadata_policies(
47    base: RequestMetadataPolicy,
48    extra: RequestMetadataPolicy,
49) -> RequestMetadataPolicy {
50    let mut merged = base.header_overrides;
51    merged.extend(extra.header_overrides);
52    RequestMetadataPolicy {
53        header_overrides: merged,
54    }
55}
56
57/// Create standard Bearer token header
58pub fn bearer_auth(api_key: &str) -> Vec<(String, String)> {
59    vec![
60        ("Authorization".to_string(), format!("Bearer {}", api_key)),
61        ("Content-Type".to_string(), "application/json".to_string()),
62    ]
63}
64
65/// Create standard API Key header (e.g. for Anthropic)
66pub fn api_key_header(api_key: &str, header_name: &str) -> Vec<(String, String)> {
67    vec![
68        (header_name.to_string(), api_key.to_string()),
69        ("Content-Type".to_string(), "application/json".to_string()),
70    ]
71}