cat_gateway/service/common/auth/
api_key.rs1use anyhow::{Result, bail};
8use poem::{Request, http::HeaderMap};
9use poem_openapi::{SecurityScheme, auth::ApiKey};
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 && Settings::check_internal_api_key(key.to_str()?)
45 {
46 return Ok(());
47 }
48 bail!("Invalid API Key");
49}