alibi_plugins/sso/
provisioning.rs1use alibi_core::{AuthResult, store::SsoProvider, wire::UserView};
3use serde_json::Value;
4use std::sync::Arc;
5
6#[derive(Clone, Debug)]
8pub struct SsoProvisioningData {
9 pub user: UserView,
10 pub user_info: Value,
13 pub token: Option<crate::oauth::OAuthTokenSet>,
14 pub provider: SsoProvider,
15}
16#[async_trait::async_trait]
17pub trait SsoUserProvisioner: Send + Sync {
18 async fn provision(&self, data: SsoProvisioningData) -> AuthResult<()>;
19}
20#[derive(Clone)]
21pub struct SsoProvisioner(pub Arc<dyn SsoUserProvisioner>);
22impl std::fmt::Debug for SsoProvisioner {
23 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24 formatter
25 .debug_struct("SsoProvisioner")
26 .finish_non_exhaustive()
27 }
28}
29
30impl super::SsoPlugin {
31 pub(super) async fn provision(
32 &self,
33 issued: &crate::oauth::handlers::ProcessOAuthUserResult,
34 user: &crate::oauth::OAuthUserInfo,
35 token: Option<&crate::oauth::OAuthTokenSet>,
36 provider: &SsoProvider,
37 ) -> AuthResult<()> {
38 if (issued.is_register || self.config.provision_user_on_every_login)
39 && let Some(provisioner) = &self.config.provision_user
40 {
41 provisioner
42 .0
43 .provision(SsoProvisioningData {
44 user: issued.user.clone(),
45 user_info: Value::Object(user.public_profile(true)),
46 token: token.cloned(),
47 provider: provider.clone(),
48 })
49 .await?;
50 }
51 Ok(())
52 }
53}