toro_auth_core/
provider.rs1use actix_web::web::{Data, ServiceConfig};
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 IntoPublic, ObjectId,
6 identity::{IdentityBackend, IdentityProvider},
7 session::{SessionBackend, SessionError, SessionProvider},
8};
9
10#[derive(Clone)]
11pub struct AuthProvider<T, J>
12where
13 T: IntoPublic
14 + ObjectId
15 + Serialize
16 + for<'de> Deserialize<'de>
17 + Clone
18 + Send
19 + Sync
20 + 'static,
21 J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
22{
23 pub session_provider: Data<SessionProvider<T>>,
24 pub identity_provider: Data<IdentityProvider<T>>,
25 _backend: Data<J>,
26}
27
28impl<
29 T: IntoPublic + ObjectId + Serialize + for<'de> Deserialize<'de> + Clone + Send + Sync + 'static,
30 J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
31> AuthProvider<T, J>
32{
33 pub fn builder(backend: J) -> AuthProviderBuilder<T, J> {
34 AuthProviderBuilder::default_with_backend(backend)
35 }
36
37 pub fn default_with_backend(backend: J) -> Self {
38 AuthProviderBuilder::default_with_backend(backend).build()
39 }
40
41 pub fn configure(self, cfg: &mut ServiceConfig) {
42 let data = Data::new(self);
43 cfg.app_data(data.clone())
44 .configure(|cfg| data.clone().identity_provider.configure(cfg))
45 .configure(|cfg| data.clone().session_provider.configure(cfg));
46 }
47
48 pub async fn validate_session(&self, session_id: String) -> Result<T, SessionError> {
49 self.session_provider.validate(session_id).await
50 }
51}
52
53pub struct AuthProviderBuilder<T, J>
54where
55 T: IntoPublic
56 + ObjectId
57 + Serialize
58 + for<'de> Deserialize<'de>
59 + Clone
60 + Send
61 + Sync
62 + 'static,
63 J: SessionBackend<T> + IdentityBackend<T> + Send + Sync + 'static,
64{
65 session_provider: SessionProvider<T>,
66 identity_provider: IdentityProvider<T>,
67 backend: J,
68}
69
70impl<
71 T: IntoPublic + ObjectId + Serialize + for<'de> Deserialize<'de> + Clone + Send + Sync + 'static,
72 J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
73> AuthProviderBuilder<T, J>
74{
75 pub fn default_with_backend(backend: J) -> Self {
76 Self {
77 session_provider: SessionProvider::<T>::default_with_backend(Data::new(Box::new(
78 backend.clone(),
79 ))),
80 identity_provider: IdentityProvider::<T>::default_with_backend(Data::new(Box::new(
81 backend.clone(),
82 ))),
83 backend,
84 }
85 }
86
87 pub fn build(self) -> AuthProvider<T, J> {
88 AuthProvider {
89 _backend: Data::new(self.backend),
90 session_provider: Data::new(self.session_provider),
91 identity_provider: Data::new(self.identity_provider),
92 }
93 }
94}