rustauth-oidc 0.2.0

Enterprise OIDC relying-party support for RustAuth.
Documentation
use rustauth_oidc::{compute_discovery_url, normalize_url, oidc_redirect_uri, OidcFlowOptions};

#[derive(Default)]
struct TestFlowOptions {
    redirect_uri: Option<String>,
}

impl OidcFlowOptions for TestFlowOptions {
    fn redirect_uri(&self) -> Option<&str> {
        self.redirect_uri.as_deref()
    }
}

#[test]
fn discovery_url_trims_trailing_slash() {
    assert_eq!(
        compute_discovery_url("https://idp.example.com/"),
        "https://idp.example.com/.well-known/openid-configuration"
    );
}

#[test]
fn shared_redirect_uri_accepts_path_or_absolute_url() {
    let path_options = TestFlowOptions {
        redirect_uri: Some("/auth/sso/callback".to_owned()),
    };
    assert_eq!(
        oidc_redirect_uri("https://app.example.com", "okta", &path_options),
        "https://app.example.com/auth/sso/callback"
    );

    let absolute_options = TestFlowOptions {
        redirect_uri: Some("https://auth.example.com/callback".to_owned()),
    };
    assert_eq!(
        oidc_redirect_uri("https://app.example.com", "okta", &absolute_options),
        "https://auth.example.com/callback"
    );
}

#[test]
fn normalize_url_rejects_relative_values() {
    assert!(normalize_url("/relative").is_err());
}