brainos_httpadapter/
auth.rs1use axum::http::{HeaderMap, StatusCode};
4
5use crate::state::AppState;
6
7pub fn extract_bearer(headers: &HeaderMap) -> Option<&str> {
9 headers
10 .get("authorization")
11 .and_then(|v| v.to_str().ok())
12 .and_then(brain::auth::extract_bearer_from_value)
13}
14
15pub async fn resolve_principal(
27 state: &AppState,
28 headers: &HeaderMap,
29) -> Option<identity::Principal> {
30 let key = extract_bearer(headers)?;
31 let agent_id =
32 brain::auth::find_key_ct(&state.api_keys, key).and_then(|k| k.agent_id.clone())?;
33 let store = state.processor.identity_store()?;
34 store
35 .principal_for(&identity::AgentHint::AgentId(agent_id.into()))
36 .await
37 .ok()
38}
39
40pub fn check_auth(
43 state: &AppState,
44 headers: &HeaderMap,
45 permission: &str,
46) -> Result<(), (StatusCode, String)> {
47 let provided_key = extract_bearer(headers);
48 let result = brain::check_auth(&state.api_keys, provided_key, permission);
49 if result.is_allowed() {
50 Ok(())
51 } else {
52 Err((
53 StatusCode::UNAUTHORIZED,
54 result
55 .error_message(permission)
56 .unwrap_or_else(|| "Unauthorized".to_string()),
57 ))
58 }
59}