pub enum BrowserInput<Message> {
Redirect {
raw_query: String,
_message: PhantomData<Message>,
},
Post {
fields: Vec<FormField>,
_message: PhantomData<Message>,
},
SimpleSignPost {
raw_body: String,
fields: Vec<FormField>,
_message: PhantomData<Message>,
},
}Expand description
Typed browser input for inbound SAML messages.
§Examples
use saml_rs::{AuthnRequest, BrowserInput, FormField, SsoResponse};
let redirect = BrowserInput::<AuthnRequest>::redirect("SAMLRequest=...");
let post = BrowserInput::<SsoResponse>::post(vec![
FormField::new("SAMLResponse", "..."),
]);
SSO responses are received through POST-family bindings, not Redirect:
use saml_rs::{BrowserInput, SsoResponse};
let _ = BrowserInput::<SsoResponse>::redirect("SAMLResponse=...");Variants§
Redirect
HTTP-Redirect input as a raw query string.
Fields
_message: PhantomData<Message>Message marker.
Post
HTTP-POST input as parsed form fields.
SimpleSignPost
HTTP-POST-SimpleSign input.
Implementations§
Source§impl BrowserInput<AuthnRequest>
impl BrowserInput<AuthnRequest>
Sourcepub fn redirect(raw_query: impl Into<String>) -> Self
pub fn redirect(raw_query: impl Into<String>) -> Self
Create Redirect input from a raw query string.
Sourcepub fn post(fields: Vec<FormField>) -> Self
pub fn post(fields: Vec<FormField>) -> Self
Create POST input from parsed fields.
Examples found in repository?
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 use saml_rs::{
14 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
15 IdpDescriptor, IdpValidationPolicy, MetadataTrustPolicy, NameId, PrivateKeyPem,
16 RelayStateParam, ReplayPolicy, RespondSso, Saml, SamlValidationContext, SpConfig,
17 SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .credentials(credentials())
35 .validation(SpValidationPolicy::strict())
36 .build()?,
37 )?;
38 let idp = Saml::idp(
39 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
40 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
41 .credentials(credentials())
42 .validation(IdpValidationPolicy::strict())
43 .build()?,
44 )?;
45
46 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
47 EntityId::try_new("https://sp.example.com/metadata")?,
48 sp.metadata_xml(),
49 MetadataTrustPolicy::UnsignedForCompatibility,
50 )?;
51 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
52 EntityId::try_new("https://idp.example.com/metadata")?,
53 idp.metadata_xml(),
54 MetadataTrustPolicy::UnsignedForCompatibility,
55 )?;
56
57 let relay_state = RelayStateParam::try_from_option(Some("demo-state".to_string()))?;
58 let started = sp.start_sso(&idp_descriptor, StartSso::post().relay_state(relay_state))?;
59 println!(
60 "SP -> AuthnRequest id = {}",
61 started.pending.request_id().as_str()
62 );
63
64 let request = idp.receive_sso(
65 &sp_descriptor,
66 BrowserInput::<AuthnRequest>::post(started.outbound.post_form()?.fields().to_vec()),
67 validation(),
68 )?;
69 println!(
70 "IdP <- request issuer = {}",
71 request.message().issuer().as_str()
72 );
73
74 let response = idp.respond_sso(
75 &sp_descriptor,
76 &request,
77 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
78 RespondSso::post(),
79 )?;
80
81 let session = sp.finish_sso(
82 &idp_descriptor,
83 &started.pending,
84 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
85 validation(),
86 );
87 let session = session?;
88 println!("SP <- authenticated = {}", session.name_id().value());
89 Ok(())
90}More examples
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 use saml_rs::{
13 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
14 IdpDescriptor, IdpValidationPolicy, LogoutRequest, LogoutResponse, MetadataTrustPolicy,
15 NameId, PrivateKeyPem, ReplayPolicy, RespondSlo, RespondSso, Saml, SamlValidationContext,
16 SloEndpoint, SpConfig, SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse,
17 StartSlo, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .slo_endpoint(SloEndpoint::post("https://sp.example.com/slo")?)
35 .credentials(credentials())
36 .validation(SpValidationPolicy::strict())
37 .build()?,
38 )?;
39 let idp = Saml::idp(
40 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
41 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
42 .slo_endpoint(SloEndpoint::post("https://idp.example.com/slo")?)
43 .credentials(credentials())
44 .validation(IdpValidationPolicy::strict())
45 .build()?,
46 )?;
47 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
48 EntityId::try_new("https://sp.example.com/metadata")?,
49 sp.metadata_xml(),
50 MetadataTrustPolicy::UnsignedForCompatibility,
51 )?;
52 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
53 EntityId::try_new("https://idp.example.com/metadata")?,
54 idp.metadata_xml(),
55 MetadataTrustPolicy::UnsignedForCompatibility,
56 )?;
57
58 let sso = sp.start_sso(&idp_descriptor, StartSso::post())?;
59 let request = idp.receive_sso(
60 &sp_descriptor,
61 BrowserInput::<AuthnRequest>::post(sso.outbound.post_form()?.fields().to_vec()),
62 validation(),
63 )?;
64 let response = idp.respond_sso(
65 &sp_descriptor,
66 &request,
67 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
68 RespondSso::post(),
69 )?;
70 let session = sp.finish_sso(
71 &idp_descriptor,
72 &sso.pending,
73 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
74 validation(),
75 )?;
76
77 let subject = session
78 .logout_subject()
79 .ok_or("session has no logout subject")?;
80 let logout = sp.start_slo(&idp_descriptor, subject, StartSlo::post())?;
81 println!("SP -> LogoutRequest id = {}", logout.pending.id().as_str());
82
83 let logout_request = idp.receive_slo(
84 &sp_descriptor,
85 BrowserInput::<LogoutRequest>::post(logout.outbound.post_form()?.fields().to_vec()),
86 validation(),
87 )?;
88 let logout_response = idp.respond_slo(
89 &sp_descriptor,
90 &logout_request,
91 RespondSlo::post().relay_state(logout.pending.relay_state().clone()),
92 )?;
93 let completed = sp.finish_slo(
94 &idp_descriptor,
95 &logout.pending,
96 BrowserInput::<LogoutResponse>::post(logout_response.post_form()?.fields().to_vec()),
97 validation(),
98 )?;
99 println!(
100 "SP <- LogoutResponse status = {}",
101 completed.status().unwrap_or("missing")
102 );
103 Ok(())
104}Sourcepub fn simple_sign(fields: Vec<FormField>) -> Self
pub fn simple_sign(fields: Vec<FormField>) -> Self
Create SimpleSign input from parsed fields.
Sourcepub fn simple_sign_body(raw_body: impl Into<String>) -> Self
pub fn simple_sign_body(raw_body: impl Into<String>) -> Self
Parse a raw application/x-www-form-urlencoded SimpleSign body.
Source§impl BrowserInput<SsoResponse>
impl BrowserInput<SsoResponse>
Sourcepub fn post(fields: Vec<FormField>) -> Self
pub fn post(fields: Vec<FormField>) -> Self
Create POST input from parsed fields.
Examples found in repository?
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 use saml_rs::{
14 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
15 IdpDescriptor, IdpValidationPolicy, MetadataTrustPolicy, NameId, PrivateKeyPem,
16 RelayStateParam, ReplayPolicy, RespondSso, Saml, SamlValidationContext, SpConfig,
17 SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .credentials(credentials())
35 .validation(SpValidationPolicy::strict())
36 .build()?,
37 )?;
38 let idp = Saml::idp(
39 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
40 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
41 .credentials(credentials())
42 .validation(IdpValidationPolicy::strict())
43 .build()?,
44 )?;
45
46 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
47 EntityId::try_new("https://sp.example.com/metadata")?,
48 sp.metadata_xml(),
49 MetadataTrustPolicy::UnsignedForCompatibility,
50 )?;
51 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
52 EntityId::try_new("https://idp.example.com/metadata")?,
53 idp.metadata_xml(),
54 MetadataTrustPolicy::UnsignedForCompatibility,
55 )?;
56
57 let relay_state = RelayStateParam::try_from_option(Some("demo-state".to_string()))?;
58 let started = sp.start_sso(&idp_descriptor, StartSso::post().relay_state(relay_state))?;
59 println!(
60 "SP -> AuthnRequest id = {}",
61 started.pending.request_id().as_str()
62 );
63
64 let request = idp.receive_sso(
65 &sp_descriptor,
66 BrowserInput::<AuthnRequest>::post(started.outbound.post_form()?.fields().to_vec()),
67 validation(),
68 )?;
69 println!(
70 "IdP <- request issuer = {}",
71 request.message().issuer().as_str()
72 );
73
74 let response = idp.respond_sso(
75 &sp_descriptor,
76 &request,
77 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
78 RespondSso::post(),
79 )?;
80
81 let session = sp.finish_sso(
82 &idp_descriptor,
83 &started.pending,
84 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
85 validation(),
86 );
87 let session = session?;
88 println!("SP <- authenticated = {}", session.name_id().value());
89 Ok(())
90}More examples
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 use saml_rs::{
13 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
14 IdpDescriptor, IdpValidationPolicy, LogoutRequest, LogoutResponse, MetadataTrustPolicy,
15 NameId, PrivateKeyPem, ReplayPolicy, RespondSlo, RespondSso, Saml, SamlValidationContext,
16 SloEndpoint, SpConfig, SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse,
17 StartSlo, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .slo_endpoint(SloEndpoint::post("https://sp.example.com/slo")?)
35 .credentials(credentials())
36 .validation(SpValidationPolicy::strict())
37 .build()?,
38 )?;
39 let idp = Saml::idp(
40 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
41 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
42 .slo_endpoint(SloEndpoint::post("https://idp.example.com/slo")?)
43 .credentials(credentials())
44 .validation(IdpValidationPolicy::strict())
45 .build()?,
46 )?;
47 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
48 EntityId::try_new("https://sp.example.com/metadata")?,
49 sp.metadata_xml(),
50 MetadataTrustPolicy::UnsignedForCompatibility,
51 )?;
52 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
53 EntityId::try_new("https://idp.example.com/metadata")?,
54 idp.metadata_xml(),
55 MetadataTrustPolicy::UnsignedForCompatibility,
56 )?;
57
58 let sso = sp.start_sso(&idp_descriptor, StartSso::post())?;
59 let request = idp.receive_sso(
60 &sp_descriptor,
61 BrowserInput::<AuthnRequest>::post(sso.outbound.post_form()?.fields().to_vec()),
62 validation(),
63 )?;
64 let response = idp.respond_sso(
65 &sp_descriptor,
66 &request,
67 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
68 RespondSso::post(),
69 )?;
70 let session = sp.finish_sso(
71 &idp_descriptor,
72 &sso.pending,
73 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
74 validation(),
75 )?;
76
77 let subject = session
78 .logout_subject()
79 .ok_or("session has no logout subject")?;
80 let logout = sp.start_slo(&idp_descriptor, subject, StartSlo::post())?;
81 println!("SP -> LogoutRequest id = {}", logout.pending.id().as_str());
82
83 let logout_request = idp.receive_slo(
84 &sp_descriptor,
85 BrowserInput::<LogoutRequest>::post(logout.outbound.post_form()?.fields().to_vec()),
86 validation(),
87 )?;
88 let logout_response = idp.respond_slo(
89 &sp_descriptor,
90 &logout_request,
91 RespondSlo::post().relay_state(logout.pending.relay_state().clone()),
92 )?;
93 let completed = sp.finish_slo(
94 &idp_descriptor,
95 &logout.pending,
96 BrowserInput::<LogoutResponse>::post(logout_response.post_form()?.fields().to_vec()),
97 validation(),
98 )?;
99 println!(
100 "SP <- LogoutResponse status = {}",
101 completed.status().unwrap_or("missing")
102 );
103 Ok(())
104}Sourcepub fn simple_sign(fields: Vec<FormField>) -> Self
pub fn simple_sign(fields: Vec<FormField>) -> Self
Create SimpleSign input from parsed fields.
Sourcepub fn simple_sign_body(raw_body: impl Into<String>) -> Self
pub fn simple_sign_body(raw_body: impl Into<String>) -> Self
Parse a raw application/x-www-form-urlencoded SimpleSign body.
Source§impl BrowserInput<LogoutRequest>
impl BrowserInput<LogoutRequest>
Sourcepub fn redirect(raw_query: impl Into<String>) -> Self
pub fn redirect(raw_query: impl Into<String>) -> Self
Create Redirect input from a raw query string.
Sourcepub fn post(fields: Vec<FormField>) -> Self
pub fn post(fields: Vec<FormField>) -> Self
Create POST input from parsed fields.
Examples found in repository?
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 use saml_rs::{
13 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
14 IdpDescriptor, IdpValidationPolicy, LogoutRequest, LogoutResponse, MetadataTrustPolicy,
15 NameId, PrivateKeyPem, ReplayPolicy, RespondSlo, RespondSso, Saml, SamlValidationContext,
16 SloEndpoint, SpConfig, SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse,
17 StartSlo, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .slo_endpoint(SloEndpoint::post("https://sp.example.com/slo")?)
35 .credentials(credentials())
36 .validation(SpValidationPolicy::strict())
37 .build()?,
38 )?;
39 let idp = Saml::idp(
40 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
41 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
42 .slo_endpoint(SloEndpoint::post("https://idp.example.com/slo")?)
43 .credentials(credentials())
44 .validation(IdpValidationPolicy::strict())
45 .build()?,
46 )?;
47 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
48 EntityId::try_new("https://sp.example.com/metadata")?,
49 sp.metadata_xml(),
50 MetadataTrustPolicy::UnsignedForCompatibility,
51 )?;
52 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
53 EntityId::try_new("https://idp.example.com/metadata")?,
54 idp.metadata_xml(),
55 MetadataTrustPolicy::UnsignedForCompatibility,
56 )?;
57
58 let sso = sp.start_sso(&idp_descriptor, StartSso::post())?;
59 let request = idp.receive_sso(
60 &sp_descriptor,
61 BrowserInput::<AuthnRequest>::post(sso.outbound.post_form()?.fields().to_vec()),
62 validation(),
63 )?;
64 let response = idp.respond_sso(
65 &sp_descriptor,
66 &request,
67 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
68 RespondSso::post(),
69 )?;
70 let session = sp.finish_sso(
71 &idp_descriptor,
72 &sso.pending,
73 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
74 validation(),
75 )?;
76
77 let subject = session
78 .logout_subject()
79 .ok_or("session has no logout subject")?;
80 let logout = sp.start_slo(&idp_descriptor, subject, StartSlo::post())?;
81 println!("SP -> LogoutRequest id = {}", logout.pending.id().as_str());
82
83 let logout_request = idp.receive_slo(
84 &sp_descriptor,
85 BrowserInput::<LogoutRequest>::post(logout.outbound.post_form()?.fields().to_vec()),
86 validation(),
87 )?;
88 let logout_response = idp.respond_slo(
89 &sp_descriptor,
90 &logout_request,
91 RespondSlo::post().relay_state(logout.pending.relay_state().clone()),
92 )?;
93 let completed = sp.finish_slo(
94 &idp_descriptor,
95 &logout.pending,
96 BrowserInput::<LogoutResponse>::post(logout_response.post_form()?.fields().to_vec()),
97 validation(),
98 )?;
99 println!(
100 "SP <- LogoutResponse status = {}",
101 completed.status().unwrap_or("missing")
102 );
103 Ok(())
104}Sourcepub fn simple_sign(fields: Vec<FormField>) -> Self
pub fn simple_sign(fields: Vec<FormField>) -> Self
Create SimpleSign input from parsed fields.
Sourcepub fn simple_sign_body(raw_body: impl Into<String>) -> Self
pub fn simple_sign_body(raw_body: impl Into<String>) -> Self
Parse a raw application/x-www-form-urlencoded SimpleSign body.
Source§impl BrowserInput<LogoutResponse>
impl BrowserInput<LogoutResponse>
Sourcepub fn redirect(raw_query: impl Into<String>) -> Self
pub fn redirect(raw_query: impl Into<String>) -> Self
Create Redirect input from a raw query string.
Sourcepub fn post(fields: Vec<FormField>) -> Self
pub fn post(fields: Vec<FormField>) -> Self
Create POST input from parsed fields.
Examples found in repository?
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 use saml_rs::{
13 AcsEndpoint, AuthnRequest, BrowserInput, CertificatePem, Credentials, EntityId, IdpConfig,
14 IdpDescriptor, IdpValidationPolicy, LogoutRequest, LogoutResponse, MetadataTrustPolicy,
15 NameId, PrivateKeyPem, ReplayPolicy, RespondSlo, RespondSso, Saml, SamlValidationContext,
16 SloEndpoint, SpConfig, SpDescriptor, SpValidationPolicy, SsoEndpoint, SsoResponse,
17 StartSlo, StartSso, Subject,
18 };
19 use std::time::SystemTime;
20
21 let privkey = include_str!("../tests/fixtures/key/sp_privkey.pem");
22 let cert = include_str!("../tests/fixtures/key/sp_signing_cert.cer");
23 let credentials = || Credentials {
24 signing_key: Some(PrivateKeyPem::new(privkey)),
25 signing_certificate: Some(CertificatePem::new(cert)),
26 ..Credentials::default()
27 };
28 let validation =
29 || SamlValidationContext::new(SystemTime::now(), ReplayPolicy::DisabledForCompatibility);
30
31 let sp = Saml::sp(
32 SpConfig::builder(EntityId::try_new("https://sp.example.com/metadata")?)
33 .acs_endpoint(AcsEndpoint::post("https://sp.example.com/acs")?)
34 .slo_endpoint(SloEndpoint::post("https://sp.example.com/slo")?)
35 .credentials(credentials())
36 .validation(SpValidationPolicy::strict())
37 .build()?,
38 )?;
39 let idp = Saml::idp(
40 IdpConfig::builder(EntityId::try_new("https://idp.example.com/metadata")?)
41 .sso_endpoint(SsoEndpoint::post("https://idp.example.com/sso")?)
42 .slo_endpoint(SloEndpoint::post("https://idp.example.com/slo")?)
43 .credentials(credentials())
44 .validation(IdpValidationPolicy::strict())
45 .build()?,
46 )?;
47 let sp_descriptor = SpDescriptor::from_metadata_xml_for(
48 EntityId::try_new("https://sp.example.com/metadata")?,
49 sp.metadata_xml(),
50 MetadataTrustPolicy::UnsignedForCompatibility,
51 )?;
52 let idp_descriptor = IdpDescriptor::from_metadata_xml_for(
53 EntityId::try_new("https://idp.example.com/metadata")?,
54 idp.metadata_xml(),
55 MetadataTrustPolicy::UnsignedForCompatibility,
56 )?;
57
58 let sso = sp.start_sso(&idp_descriptor, StartSso::post())?;
59 let request = idp.receive_sso(
60 &sp_descriptor,
61 BrowserInput::<AuthnRequest>::post(sso.outbound.post_form()?.fields().to_vec()),
62 validation(),
63 )?;
64 let response = idp.respond_sso(
65 &sp_descriptor,
66 &request,
67 Subject::new(NameId::new("alice@example.com", None), Vec::new()),
68 RespondSso::post(),
69 )?;
70 let session = sp.finish_sso(
71 &idp_descriptor,
72 &sso.pending,
73 BrowserInput::<SsoResponse>::post(response.post_form()?.fields().to_vec()),
74 validation(),
75 )?;
76
77 let subject = session
78 .logout_subject()
79 .ok_or("session has no logout subject")?;
80 let logout = sp.start_slo(&idp_descriptor, subject, StartSlo::post())?;
81 println!("SP -> LogoutRequest id = {}", logout.pending.id().as_str());
82
83 let logout_request = idp.receive_slo(
84 &sp_descriptor,
85 BrowserInput::<LogoutRequest>::post(logout.outbound.post_form()?.fields().to_vec()),
86 validation(),
87 )?;
88 let logout_response = idp.respond_slo(
89 &sp_descriptor,
90 &logout_request,
91 RespondSlo::post().relay_state(logout.pending.relay_state().clone()),
92 )?;
93 let completed = sp.finish_slo(
94 &idp_descriptor,
95 &logout.pending,
96 BrowserInput::<LogoutResponse>::post(logout_response.post_form()?.fields().to_vec()),
97 validation(),
98 )?;
99 println!(
100 "SP <- LogoutResponse status = {}",
101 completed.status().unwrap_or("missing")
102 );
103 Ok(())
104}Sourcepub fn simple_sign(fields: Vec<FormField>) -> Self
pub fn simple_sign(fields: Vec<FormField>) -> Self
Create SimpleSign input from parsed fields.
Sourcepub fn simple_sign_body(raw_body: impl Into<String>) -> Self
pub fn simple_sign_body(raw_body: impl Into<String>) -> Self
Parse a raw application/x-www-form-urlencoded SimpleSign body.
Trait Implementations§
Source§impl<Message: Clone> Clone for BrowserInput<Message>
impl<Message: Clone> Clone for BrowserInput<Message>
Source§fn clone(&self) -> BrowserInput<Message>
fn clone(&self) -> BrowserInput<Message>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more