Skip to main content

raw_compat/
raw_compat.rs

1//! Low-level samlify-port SSO example on the raw API.
2//!
3//! `SpValidationPolicy::compatibility` is the typed name for keeping this
4//! behavior on the builders. New browser integrations should start with
5//! `examples/sso.rs`. This example is for callers that need direct access to
6//! raw `ServiceProvider`, `IdentityProvider`, `HttpRequest`, or `FlowResult`
7//! values.
8
9#[cfg(any(
10    feature = "crypto-rustcrypto",
11    feature = "crypto-aws-lc",
12    feature = "crypto-fips"
13))]
14fn main() -> Result<(), Box<dyn std::error::Error>> {
15    use saml_rs::constants::signature_algorithm::RSA_SHA256;
16    use saml_rs::raw::metadata::{Endpoint, IdpMetadataConfig, SpMetadataConfig};
17    use saml_rs::raw::{
18        Binding, EntitySetting, HttpRequest, IdentityProvider, LoginResponseOptions,
19        ServiceProvider, User,
20    };
21
22    let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
23    let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
24    let signing = || {
25        let mut setting = EntitySetting::default();
26        setting.private_key = Some(privkey.into());
27        setting.signing_cert = Some(cert.into());
28        setting.request_signature_algorithm = RSA_SHA256.into();
29        setting
30    };
31
32    let idp = IdentityProvider::from_config(
33        &IdpMetadataConfig {
34            entity_id: "https://idp.example.com/metadata".into(),
35            signing_certs: vec![cert.into()],
36            want_authn_requests_signed: true,
37            single_sign_on_service: vec![Endpoint::new(
38                Binding::Post,
39                "https://idp.example.com/sso",
40            )],
41            ..Default::default()
42        },
43        signing(),
44    )?;
45    let sp = ServiceProvider::from_config(
46        &SpMetadataConfig {
47            entity_id: "https://sp.example.com/metadata".into(),
48            authn_requests_signed: true,
49            want_assertions_signed: true,
50            signing_certs: vec![cert.into()],
51            assertion_consumer_service: vec![Endpoint::new(
52                Binding::Post,
53                "https://sp.example.com/acs",
54            )],
55            ..Default::default()
56        },
57        signing(),
58    )?;
59
60    let request = sp.create_login_request(&idp, Binding::Post, None)?;
61    let parsed = idp.parse_login_request(
62        &sp,
63        Binding::Post,
64        &HttpRequest::post(vec![("SAMLRequest".into(), request.context.clone())]),
65    )?;
66    let response = idp.create_login_response(
67        &sp,
68        Binding::Post,
69        &User::new("alice@example.com"),
70        &LoginResponseOptions {
71            in_response_to: parsed.extract.get_str("request.id"),
72            ..Default::default()
73        },
74    )?;
75    let result = sp.parse_login_response_with_request_id(
76        &idp,
77        Binding::Post,
78        &HttpRequest::post(vec![("SAMLResponse".into(), response.context)]),
79        &request.id,
80    )?;
81    println!(
82        "samlify-port raw authenticated = {:?}",
83        result.extract.get_str("nameID")
84    );
85    Ok(())
86}
87
88#[cfg(not(any(
89    feature = "crypto-rustcrypto",
90    feature = "crypto-aws-lc",
91    feature = "crypto-fips"
92)))]
93fn main() {
94    eprintln!("Enable a crypto provider feature (`crypto-bergshamra` is on by default).");
95}