openauth-oidc 0.1.0

Enterprise OIDC relying-party support for OpenAuth.
Documentation
/// Options needed to compute an OIDC redirect URI.
pub trait OidcFlowOptions {
    /// Optional shared redirect URI override.
    fn redirect_uri(&self) -> Option<&str>;
}

pub fn oidc_redirect_uri(
    base_url: &str,
    provider_id: &str,
    options: &impl OidcFlowOptions,
) -> String {
    if let Some(redirect_uri) = options
        .redirect_uri()
        .filter(|value| !value.trim().is_empty())
    {
        if url::Url::parse(redirect_uri).is_ok() {
            return redirect_uri.to_owned();
        }
        let path = if redirect_uri.starts_with('/') {
            redirect_uri.to_owned()
        } else {
            format!("/{redirect_uri}")
        };
        return format!("{}{}", base_url.trim_end_matches('/'), path);
    }
    format!(
        "{}/sso/callback/{}",
        base_url.trim_end_matches('/'),
        provider_id
    )
}