1#[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}