auth_framework/server/core/
additional_modules.rs1pub mod jwt_server {
9 use crate::errors::Result;
10 use crate::storage::AuthStorage;
11 use serde::{Deserialize, Serialize};
12 use std::sync::Arc;
13
14 #[derive(Debug, Clone)]
15 pub struct JwtServerConfig {
16 pub issuer: String,
17 pub key_id: String,
18 }
19
20 impl Default for JwtServerConfig {
21 fn default() -> Self {
22 Self {
23 issuer: "https://auth.example.com".to_string(),
24 key_id: "default".to_string(),
25 }
26 }
27 }
28
29 pub struct JwtServer {
30 config: JwtServerConfig,
31 storage: Arc<dyn AuthStorage>,
32 }
33
34 impl JwtServer {
35 pub async fn new(config: JwtServerConfig, storage: Arc<dyn AuthStorage>) -> Result<Self> {
36 Ok(Self { config, storage })
37 }
38
39 pub async fn initialize(&self) -> Result<()> {
40 Ok(())
41 }
42
43 pub async fn get_well_known_jwt_configuration(&self) -> Result<JwtWellKnownConfiguration> {
44 Ok(JwtWellKnownConfiguration {
45 issuer: self.config.issuer.clone(),
46 jwks_uri: format!("{}/jwks", self.config.issuer),
47 })
48 }
49
50 pub async fn store_jwt_metadata(&self, metadata: &JwtWellKnownConfiguration) -> Result<()> {
52 let key = format!("jwt_metadata:{}", self.config.issuer);
53 let value = serde_json::to_string(metadata).map_err(|e| {
54 crate::errors::AuthError::internal(format!("Serialization error: {}", e))
55 })?;
56
57 self.storage.store_kv(&key, value.as_bytes(), None).await?;
58 log::info!("Stored JWT metadata for issuer: {}", self.config.issuer);
59 Ok(())
60 }
61
62 pub async fn get_stored_metadata(&self) -> Result<Option<JwtWellKnownConfiguration>> {
64 let key = format!("jwt_metadata:{}", self.config.issuer);
65
66 if let Some(value_bytes) = self.storage.get_kv(&key).await? {
67 let value = String::from_utf8(value_bytes).map_err(|e| {
68 crate::errors::AuthError::internal(format!("UTF-8 conversion error: {}", e))
69 })?;
70 let metadata: JwtWellKnownConfiguration =
71 serde_json::from_str(&value).map_err(|e| {
72 crate::errors::AuthError::internal(format!("Deserialization error: {}", e))
73 })?;
74 Ok(Some(metadata))
75 } else {
76 Ok(None)
77 }
78 }
79
80 pub async fn store_signing_key(&self, key_data: &str) -> Result<()> {
82 let key = format!("jwt_key:{}", self.config.key_id);
83 self.storage
84 .store_kv(&key, key_data.as_bytes(), None)
85 .await?;
86 log::info!("Stored JWT signing key: {}", self.config.key_id);
87 Ok(())
88 }
89 }
90
91 #[derive(Debug, Clone, Serialize, Deserialize)]
92 pub struct JwtWellKnownConfiguration {
93 pub issuer: String,
94 pub jwks_uri: String,
95 }
96}
97
98pub mod api_gateway {
100 use crate::errors::Result;
101 use crate::storage::AuthStorage;
102 use std::sync::Arc;
103
104 #[derive(Debug, Clone)]
105 pub struct ApiGatewayConfig {
106 pub name: String,
107 }
108
109 impl Default for ApiGatewayConfig {
110 fn default() -> Self {
111 Self {
112 name: "API Gateway".to_string(),
113 }
114 }
115 }
116
117 pub struct ApiGateway {
118 config: ApiGatewayConfig,
119 storage: Arc<dyn AuthStorage>,
120 }
121
122 impl ApiGateway {
123 pub async fn new(config: ApiGatewayConfig, storage: Arc<dyn AuthStorage>) -> Result<Self> {
124 Ok(Self { config, storage })
125 }
126
127 pub async fn initialize(&self) -> Result<()> {
128 Ok(())
129 }
130
131 pub async fn store_gateway_metadata(&self) -> Result<()> {
133 let key = format!("api_gateway_config:{}", self.config.name);
134 let metadata = serde_json::json!({
135 "name": self.config.name,
136 "initialized_at": chrono::Utc::now().to_rfc3339()
137 });
138 let value = serde_json::to_string(&metadata).map_err(|e| {
139 crate::errors::AuthError::internal(format!("Serialization error: {}", e))
140 })?;
141
142 self.storage.store_kv(&key, value.as_bytes(), None).await?;
143 log::info!("Stored API Gateway metadata for: {}", self.config.name);
144 Ok(())
145 }
146
147 pub async fn store_route_config(&self, route_path: &str, config_data: &str) -> Result<()> {
149 let key = format!("api_gateway_route:{}:{}", self.config.name, route_path);
150 self.storage
151 .store_kv(&key, config_data.as_bytes(), None)
152 .await?;
153 log::info!(
154 "Stored route config for {} on gateway: {}",
155 route_path,
156 self.config.name
157 );
158 Ok(())
159 }
160
161 pub async fn get_route_config(&self, route_path: &str) -> Result<Option<String>> {
163 let key = format!("api_gateway_route:{}:{}", self.config.name, route_path);
164
165 if let Some(config_bytes) = self.storage.get_kv(&key).await? {
166 let config = String::from_utf8(config_bytes).map_err(|e| {
167 crate::errors::AuthError::internal(format!("UTF-8 conversion error: {}", e))
168 })?;
169 Ok(Some(config))
170 } else {
171 Ok(None)
172 }
173 }
174
175 pub fn get_gateway_name(&self) -> &str {
177 &self.config.name
178 }
179 }
180}
181
182pub mod saml_idp {
184 use crate::errors::Result;
185 use crate::storage::AuthStorage;
186 use serde::{Deserialize, Serialize};
187 use std::sync::Arc;
188
189 #[derive(Debug, Clone)]
190 pub struct SamlIdpConfig {
191 pub entity_id: String,
192 }
193
194 impl Default for SamlIdpConfig {
195 fn default() -> Self {
196 Self {
197 entity_id: "https://auth.example.com".to_string(),
198 }
199 }
200 }
201
202 pub struct SamlIdentityProvider {
203 config: SamlIdpConfig,
204 storage: Arc<dyn AuthStorage>,
205 }
206
207 impl SamlIdentityProvider {
208 pub async fn new(config: SamlIdpConfig, storage: Arc<dyn AuthStorage>) -> Result<Self> {
209 Ok(Self { config, storage })
210 }
211
212 pub async fn initialize(&self) -> Result<()> {
213 Ok(())
214 }
215
216 pub async fn get_metadata(&self) -> Result<SamlMetadata> {
217 Ok(SamlMetadata {
218 entity_id: self.config.entity_id.clone(),
219 })
220 }
221
222 pub async fn store_saml_metadata(&self, metadata: &SamlMetadata) -> Result<()> {
224 let key = format!("saml_metadata:{}", self.config.entity_id);
225 let value = serde_json::to_string(metadata).map_err(|e| {
226 crate::errors::AuthError::internal(format!("Serialization error: {}", e))
227 })?;
228
229 self.storage.store_kv(&key, value.as_bytes(), None).await?;
230 log::info!("Stored SAML metadata for entity: {}", self.config.entity_id);
231 Ok(())
232 }
233
234 pub async fn store_assertion(
236 &self,
237 assertion_id: &str,
238 assertion_data: &str,
239 ) -> Result<()> {
240 let key = format!("saml_assertion:{}:{}", self.config.entity_id, assertion_id);
241 self.storage
242 .store_kv(
243 &key,
244 assertion_data.as_bytes(),
245 Some(std::time::Duration::from_secs(3600)),
246 )
247 .await?;
248 log::info!(
249 "Stored SAML assertion {} for entity: {}",
250 assertion_id,
251 self.config.entity_id
252 );
253 Ok(())
254 }
255
256 pub async fn get_assertion(&self, assertion_id: &str) -> Result<Option<String>> {
258 let key = format!("saml_assertion:{}:{}", self.config.entity_id, assertion_id);
259
260 if let Some(assertion_bytes) = self.storage.get_kv(&key).await? {
261 let assertion = String::from_utf8(assertion_bytes).map_err(|e| {
262 crate::errors::AuthError::internal(format!("UTF-8 conversion error: {}", e))
263 })?;
264 Ok(Some(assertion))
265 } else {
266 Ok(None)
267 }
268 }
269 }
270
271 #[derive(Debug, Clone, Serialize, Deserialize)]
272 pub struct SamlMetadata {
273 pub entity_id: String,
274 }
275}
276
277pub mod consent {
279 }
281
282pub mod introspection {
283 }
285
286pub mod device_flow_server {
287 }
289
290