Z kroku 1 jsme získali ověřenou URL adresu pro přesměrování uživatele na autorizaci
Nyní je třeba vytvořit autorizační požadavek a tento předat NIA IdP
private function generateAuthnRequest(EntityDescriptor $idp_descriptor)
{
// stejně jako v předchozích ukázkách, NiaContainer a NiaServiceProvider jsou
// implementace specifické pro vaši aplikaci / produkční prostředí
// jejich popis je mimo možnosti tohoto manuálu
$nia_container = new NiaContainer($this);
$service_provider = new NiaServiceProvider();
ContainerSingleton::setContainer($nia_container);
// získání url adresy, na kterou přesměrovat uživatele při metodě HTTP-REDIRECT
$urls = $this->extractSSOLoginUrls($idp_descriptor);
$sso_redirect_login_url = $urls[Constants::BINDING_HTTP_REDIRECT];
// samotný AuthnRequest
$auth_request = new AuthnRequest();
// unikátní ID
$auth_request->setId($nia_container->generateId());
// Issuer, neboli "Unikátní URL adresa zabezpečené části Vašeho webu"
$auth_request->setIssuer($nia_container->getIssuer());
// explicitní deklarace příjemce zprávy
$auth_request->setDestination($sso_redirect_login_url);
// adresa kam se má uživatel přesměrovat při dokončení procesu na straně IdP
$auth_request->setAssertionConsumerServiceURL(NiaServiceProvider::$AssertionConsumerServiceURL);
// vyžadovaná úroveň ověření identity
// LOW dovoluje využít NIA jméno+heslo+sms, stejně jako datovou schránku FO nebo identitu zahraničního občana
// SUBSTANTIAL pak dovoluje méně variant
// HIGH dovoluje pouze elektronický občanský průkaz
$auth_request->setRequestedAuthnContext([
'AuthnContextClassRef' => [NiaServiceProvider::LOA_LOW],
'Comparison' => 'minimum'
]);
// vygenerování nepodepsaného požadavku
$auth_request_xml_domelement = $auth_request->toUnsignedXML();
// přidání vyžadovaných atributů (informací o uživateli), element samlp:Extensions
$exts = new NiaExtensions($auth_request_xml_domelement);
$exts->addAllDefaultAttributes();
$auth_request_xml_domelement = $exts->toXML();
$auth_request_xml = $auth_request_xml_domelement->ownerDocument->saveXML($auth_request_xml_domelement);
$auth_request_xml_domelement = DOMDocumentFactory::fromString($auth_request_xml);
// vložení vlastního podpisu naším privátním klíčem
$auth_request_xml_domelement = $service_provider->insertSignature($auth_request_xml_domelement->documentElement);
return $auth_request_xml_domelement;
}
<?xml version="1.0"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_ecefa1de-1537-4a3d-8b07-f37f32d6e868" Version="2.0" IssueInstant="2024-10-29T10:28:54Z" Destination="https://tnia.identitaobcana.cz/FPSTS/saml2/basic" AssertionConsumerServiceURL="https://nia.otevrenamesta.cz/ExternalLogin">
<saml:Issuer>https://nia.otevrenamesta.cz/</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#_ecefa1de-1537-4a3d-8b07-f37f32d6e868"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>az7nESA+XyqE/rOAWyr6C0ENgZ0faqCkRNL21vB6KBM=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>QlF6KY0dlmpneG/xhqcWwr9B98uT8zU8f01/NY73LYjV1PbP7+OFyaaTtDp5Rnk7uaZaLgYJfDia+3QD9jPgwEK/VGLzp8VTcNTMRXd/N2zn3PcDtUXTqbQgAFL8XKUdmE4eBr1dkJb23KV4HYdn03JPo2Ch2/3ig32/GCpf0DYYO0jiyQk8Xy1EylMXC+Txkutpd5OrUBRHx+1lr7U2EO3WPgRFWp+cShUbleMXBBF2EGjDbLl6kRde//1XQbsW2tdnQED+7lv6JMNSt66doNVrpFkxC29IrplsGX6RsORlX2q2X/+Y5EVv6mCIVzODk+FT6SmWsMI9pvd0v1BZQw==</ds:SignatureValue>
<ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIIDdDCCAlygAwIBAgIRAP9sUbldL412M4EpX2fV5PwwDQYJKoZIhvcNAQELBQAwJDEiMCAGA1UEAwwZaHR0cHM6Ly9vdGV2cmVuYW1lc3RhLmN6LzAeFw0xOTEwMDEwOTM1MjhaFw0yMjA5MTUwOTM1MjhaMBQxEjAQBgNVBAMMCXN6cmMtdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7C+gGDVHuZSYz2MDq21UB/e3UXiU7L3iJvv8GEzJoi+SvauCU/Ui5oGc/w2MqZ21E463aDadjksRFSB+9z/uw2yNna+Wctg2RoY4CMZNdp/MxunRIT9/U0ecXVHPcqsnTnVykK1QYUv8BaGHLQH0Okk/7+SWHR/MMXcJ7OTI4owm8bFRKN/PFaUtCSNYxhUnP51quWwx6EXoHXZWAq//7YCZP+WL7dcmnql4JxjpZGq4lINqCGA8WXw0EuXbUs5vakl5SFmDMezmiO5IEi1Mk5vmv649p2gUa4qpVPgHkhCqOSRB0BAeEh63hZM05Z+HkDb6R8VYAdFW3ZEL0lXw8CAwEAAaOBsDCBrTAJBgNVHRMEAjAAMB0GA1UdDgQWBBRJIq+FqevCnV5u7guRRfs8k4KbmDBfBgNVHSMEWDBWgBTypM00nD30BAjXOIrO8l6xFnzxvaEopCYwJDEiMCAGA1UEAwwZaHR0cHM6Ly9vdGV2cmVuYW1lc3RhLmN6L4IUdCc7pFsR+OGBk+abd7ssRaIIM1EwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQBHSwJPSnC6G+978X/Lk4UMx1QMXmUpvaWnELBMyAcdpRsN9RsOsiJKLYiTAHFLHDwAF0cd/2ZxcwqHu2dX2jwVfOE+Z3UhHEBmvLTPBQq96y62KO4Px7//6gQchK+zER5ZfOP7jAqqziIu+SuI4xJ3zBgEGb4wr3EdQqonNnk6rZh7uJlnCWaoZACg5+S97aK77HaJgk775lFYhDiuQBRD6GKLJoqR1Yvg12RN0X1UbCV5hUF0UEOgHhbNNmZIU9qrKeVKefekDSjzd8xDIU6Ic5w3gKS01CecLQL7/tSpi/s3X+1f4yTjozurqNjUV7gBxcyYRw+4vE4aa4qx/gWd</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature>
<saml:Conditions>
<saml:AudienceRestriction>
<saml:Audience>https://nia.otevrenamesta.cz/ExternalLogin</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<samlp:RequestedAuthnContext Comparison="minimum">
<saml:AuthnContextClassRef>http://eidas.europa.eu/LoA/low</saml:AuthnContextClassRef>
</samlp:RequestedAuthnContext>
<samlp:Extensions xmlns:eidas="http://eidas.europa.eu/saml-extensions">
<eidas:SPType xmlns:eidas="http://eidas.europa.eu/saml-extensions">public</eidas:SPType>
<eidas:RequestedAttributes xmlns:eidas="http://eidas.europa.eu/saml-extensions">
<eidas:RequestedAttribute Name="http://www.stork.gov.eu/1.0/age" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://www.stork.gov.eu/1.0/countryCodeOfBirth" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://eidas.europa.eu/attributes/naturalperson/CurrentAddress" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://eidas.europa.eu/attributes/naturalperson/DateOfBirth" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://www.stork.gov.eu/1.0/eMail" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://www.stork.gov.eu/1.0/isAgeOver" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<eidas:AttributeValue>18</eidas:AttributeValue>
</eidas:RequestedAttribute>
<eidas:RequestedAttribute Name="http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://schemas.identitaobcana.cz/moris/2016/identity/claims/idnumber" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://schemas.identitaobcana.cz/moris/2016/identity/claims/idtype" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://schemas.identitaobcana.cz/moris/2016/identity/claims/tradresaid" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
<eidas:RequestedAttribute Name="http://schemas.eidentity.cz/moris/2016/identity/claims/phonenumber" isRequired="false" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
</eidas:RequestedAttributes>
</samlp:Extensions>
</samlp:AuthnRequest>
Adresa na kterou přesměrujeme uživatele se skládá následovně
// EntityDescriptor pro IdP
$idp_descriptor = generateIdpDescriptor();
// viz. výše
$authn_request = generateAuthnRequest($idp_descriptor);
// komprese a enkódování požadavku
$xml = $signed_request->ownerDocument->saveXML();
$query = gzdeflate($xml);
$query = base64_encode($query);
$query = urlencode($query);
// získání URL adresy
// $redirect_url je popsána v posledním bodě kroku 1
$final_url = $redirect_url . (parse_url($redirect_url, PHP_URL_QUERY) ? '&' : '?') . 'SAMLRequest=' . $query;
"https://tnia.identitaobcana.cz/FPSTS/saml2/basic?SAMLRequest=1VjZcuK6Fn3vr6DoR1fiERuoJKc8AQabwcZgeLklbGEMnuUB%2BPorSEKn0%2FM951TffgJtaS8tbe0tLfnhr2MUNiqYoyCJH5v0PdX86%2BnDAwJRmHbFstjFJsxKiIoGHhej7rXjsVnmcTcBKEDdGEQQdQu3a4mG3mXuqW6aJ0XiJmHzjcv3PQBCMC8wgWZDUx6b%2F4Eu3ALag3d0ixXuOMB6d%2B0NJdxtWWHLMh4P23y72Vi8ksYQ2BGhEmoxKkBcYBPFcHc0dcd05jTVZdrdFrduNhS8jiAGxdVrVxQp6pJkEQfgPvBgXAQFSDYuiMG9eyZ7U2tukRfuDLnBvN1mQ3ylKScxKiOYWzCvAhfapv4J7oKWFLDK4XWdxRVMPRYwj0GoJ34QN5%2Bu4e1eGedP33V8IN8OffBQ1wp8vIIyhy%2FR9dDz3Bihruv7mr1Pcp9kKIoiqQ6Jx3go8D82nz40Gq%2Fu0NPibXJFk0GcxIELwuB8DYsBi13iNcTQT%2FKg2EXfwKZJmrpg38Gje%2BfSXPyxSV5m%2BDTHleJPo1HcK9O7KMnhxxyBO7QDTIt%2Fxr2gmnALcWxc2LBN7bH58eey5LrKeQ5itE3yCH3e%2FCGzz2II4wqGSQq9O%2FS6QMzu1wC%2FGrgH8kuOSuDjHPjFAOLofLyF7RPKAoQlfAJnIVYtkXBOmUrmE3F5ynmZUsf%2BmtqCTD6YY52hK4kfScbjldFb56vhtgPPzXepdNv1Z49Z2ONHK8oLozSGffK4y9xlnXekTruct892e4tZj1cCq6%2F2C3q6mQrEpHcCYF4oacuMD0IJ1kD3V8OtEgCCnSmd%2FdSv1RG56OvntL2Yu%2BO5YToeOWbOMTt1lcJ25tlm5os9ve2MbC9SOSjltHcYbhh2tOAGKy%2Bm2OE0YeQdQ7KBzzJkX063lLJaTah9cJod2s6JVk%2Bh4cjE%2FHgoi9RrTXJbMgdHgg5zwWbUCbuc%2BmZvmRKutbM3ITQcSeoxan%2BvbPSQP5geJEnamW3Qkim8eKYqhBBW%2FNAYWwXPe8l4kae9w1FmOlqehqjv8CaamKHDZIxDEquWuqj4SNYW54lyIHpz3oqWyNA6aeVRFS2tZ%2FXj4y30b2L94RL%2FETzd9sJpUR0FFODWkC8H1xYXegGfDE1TPEWWxfDki7Umib5mitMOwuvxdI5mDE5NHWa7aE3rWpmthqNkre0qdyzOVF2aifVQUQNDFvsibatiXa%2FBwKTcgcHrp07l9ReMGy3K1ZIOXdbc6dGY188i7NXUcTJXa0NR68ncoI39DmDbydiLLWNu32yGNDuqe3Em%2BeOFJBqG7Ix5NzIKjHu%2Bcra095wkzEnxfXUqXvpniYz%2FS6IuyITfVxaDcm2tzoyhZAxtSyRkbSewBZ0NhlXV7qvnYRIQVgVK2SbtoJX0XbJmjGzN0CrHs0AB3v6AzJ4lEZ0zWdbMaRwDYukWPmMmK0421mMvJY1jGZvavEPaFHSdxWDqZiiex4vTYUTPVnbVlkB%2FoM8G1ORwIAXCWg5M0jAcdyhM5hqX1FF70zNHY3LaA3YhW%2BPVcWfH0xadlcv6yKtOMnDWSzEjSWElr6fEUhc8N4qzkBse9%2Bm6n3GhNs7kvtheOjWlls7GRq0KHMKW1YsUA56jYNLS1IA2Dq0qqniukzK%2BDbgsXUz9wWEnZxPLlChJhOqOZ3drg2qticFB2fBme7ESvd6SXas6FTp1WxZrVRTBREKKLOVzcXjZp4FpqOJeFA2JuuSEp%2FizpSSZQy0jehms5HjRKgW%2FNM0tah%2B40SZSpO3VzzLUpSItfWl%2BSg2KihUWk9g7Ey2ftEP%2B2IvPxwqoSSqvfj3nOM32ZFdIe8gkJn3pQICNJyBkAk0zaLVW65WyMKlQwmCyv9JG9QrnkT3A9VDLz31TSZwpog9FQ6T6spX1LW3DKjjf5NoWRQ7XzUwaWPVwasUy3yc6Qtsh9QNnG0d6ZjiRnVZgGeOKMU6i66UmGndwraNgONJXwVwc9PSBUos9yvVIZn1062xQMp7D7OvFdqISa9beDVQpqvT5VJplHf7EM6MJNz0KJMn7M3c3Is6q2VpvJ1NhL2bZOdBKwio17jhkz5Kv9jdcnbOqN8uSeBwf%2BHy9E8phGMtLkKxF2W8RVkcAI0EYgKF%2FEIRW2FvtlKCcSabC90f6MMlMelX5NGOOKYe2N%2FKitbN7lK1O%2FMFuMx5Ha83uZPkILkb4Vjgo1v7stY%2BKZvOa26pZf2RRtAxdfaYLZGGlAYlYh6C33Gm%2BT85lno339kLwpaN7Wpk1wVUqB3BGHkl%2F6V1PuPeH1s34fKyRbw%2B8z07EF3GFJZoXXBQNejGIpRdc7i4T32l54F663vV8X4l9JuFeZNnN8137sznIr%2FJJuy%2B6GnpXlY37C3gsGnISpSAP0EWhRkEcRGXUvPH8NE4OsWbG9%2FHTix6AgQfQPSzzJAX4h9QTkQyT%2BsbrK57Pfd%2Fg8Urysur4orLRi9y8TnSTIe%2BnvThhafPqg5lfR3StKS5x%2BL9BpOUmDNwH8i3SK%2B4n7gUO%2BKYs4N%2Fj%2BSVeY4xT4DPZhYokP9z7SXUBwu8lEviw2QjQxTfIoffY3IIQYdPFs4cFHSh%2B8PrBc12sd9vr4G6ZBxf59jcYuUkZF%2FlJTjw42UpBXux%2BH8H3oQe3nSKvBQvCFL%2FjkpiUyxwXXCF6Xg4R%2BnMI90AUhKcLxJ%2FDuR9UMP5DKOMD%2F%2Fdn8VfLDBogCP%2FPOAUIS5ZJBfN%2FnNcrrRub57cH3X49mt91vJq%2FXMY%2FniLT6492%2FYazDf6Ftf%2F0niB3ByNM%2BsvvSRF%2BwSP8WKd58qXzRLohCCKE23EZbf5A2gW%2Biv8w0kUOLvcLCLzfTxy%2BkvsB53SXxPDfS5Fv1im6acRPMvBmevtt%2BOnDfwE%3D"
Otevřením finální URL se spustí proces autorizace u NIA, jeho dokončením se vrátíte na tento tutoriál na Krok 3