Skip to main content

alibi_plugins/sso/
provisioning.rs

1//! Application provisioning after successful SSO account and session creation.
2use alibi_core::{AuthResult, store::SsoProvider, wire::UserView};
3use serde_json::Value;
4use std::sync::Arc;
5
6/// Successful SSO identity, protocol profile, and optional OIDC tokens.
7#[derive(Clone, Debug)]
8pub struct SsoProvisioningData {
9    pub user: UserView,
10    /// User provisioning receives mapped user info. Organization role policies receive
11    /// mapped OIDC user info or raw SAML assertion attributes, matching Better Auth.
12    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}