cat_gateway/service/common/auth/
api_key.rs1use anyhow::{bail, Result};
8use poem::{http::HeaderMap, Request};
9use poem_openapi::{auth::ApiKey, SecurityScheme};
10
11use crate::settings::Settings;
12
13pub(crate) const API_KEY_HEADER: &str = "X-API-Key";
15
16#[derive(SecurityScheme)]
18#[oai(
19 ty = "api_key",
20 key_name = "X-API-Key", key_in = "header",
22 checker = "api_checker"
23)]
24#[allow(dead_code)]
25pub(crate) struct InternalApiKeyAuthorization(String);
26
27#[allow(clippy::unused_async)]
29async fn api_checker(
30 _req: &Request,
31 api_key: ApiKey,
32) -> Option<String> {
33 if Settings::check_internal_api_key(&api_key.key) {
34 Some(api_key.key)
35 } else {
36 None
37 }
38}
39
40pub(crate) fn check_api_key(headers: &HeaderMap) -> Result<()> {
43 if let Some(key) = headers.get(API_KEY_HEADER) {
44 if Settings::check_internal_api_key(key.to_str()?) {
45 return Ok(());
46 }
47 }
48 bail!("Invalid API Key");
49}