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="_55c30a0a-f31a-493f-bcb2-b7608bd20f90" Version="2.0" IssueInstant="2026-01-05T14:17:29Z" Destination="https://tnia.identita.gov.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="#_55c30a0a-f31a-493f-bcb2-b7608bd20f90"><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>6vRMr2NAUIMVmOe3pdQ35fxCZCDvhqBCAIKgRZJFQEo=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>dJnsfGqzPZx+YqVNs5DGhsaBtjacw+ZGwcYMb43OkPMLaJb7INrRhtrUV0NtOgvZfZCu0N+uPmIO/lhGARL7SYyofs6g7w3AELh6dqcFJroH2SJmohNo2ZW5dZL/iu1Mt7SqkQwzrLO1+sKRwBZbjTUO9as4jmqRCiWBaWA9RBAkL2JjcxDb/B59tUhq3qckHdidbBGh9zpsmfbXdkopKJ03pY0hINa6PcmfjxzxePi3IUYDzMQIE6abHt9ZdGyZkc/ljGcl1gGD2Bi6IkJKe4z8J2dhAIPy7Y/J9vDFe8dh0Aph1mozwE0MY2DVHXYn8C2NBzES9N/yG+e5h1FX0A==</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.identita.gov.cz/FPSTS/saml2/basic?SAMLRequest=1VjZkuK4En3vryDoR6LKCwYD0VUT8gIYbBYbs%2FjlhmwL2%2BBdXoCvv4Kqoqure7Y7MzG3n0CZyqOjVEo68pdfTlHYqFCOgyR%2BajKPdPOX509fMIzCdADKwo91lJUIFw3SL8aDm%2BOpWebxIIE4wIMYRggPCmdgAE0dsI%2F0IM2TInGSsPku5LcjIMYoLwiBZkORnpr%2F6XScNg1p%2BLBvM%2FCB67f3D7Zjsw8236V7tsvS%2Bz7dbKzfSBMIEohxiZQYFzAuiIlmuw8080B3Vgw3YPgB27eaDYnMI4hhcYvyiyLFA4oq4gA%2BBi6Ki6CAj15SPToXargwVgZ1Zc5SNmHtNBvgjaSYxLiMUG6gvAocZOrqV7ArVlKgKke3WRJAAiafCpTHMFQTL4ibz7fkDm588%2BffDPxCve%2F6xcUDI%2FAI%2FzJHr7l18cvYBKGu68e6%2FZjkHsXSNE3RfYr0cXHgfW4%2Bf2o03sKRq8T75IYmwjiJAweGweWWFA0VfuI2QOgleVD40a9gMxRDX7Ef0Ml5cBgu%2FtykriN8HeNG8Q%2Bj0dwb04coydHnHMMH7EO2033BvaLqaI9IbhzUMHXlqfn5j9XIbZarHMZ4n%2BQR%2Frb5u8y%2BySGKKxQmKXIf8NsECbs%2FB%2FjDxH2hvucoBR6pgT%2BZQJKdz%2Fe0fUVZw7BEz91K13J2BkxFW0dz1E7dZbuzP4mWKFV%2BJohAmXq6NRku5eTpxuh98M1wX4GX5odSuq%2F6S4Q7IdMZZZeFdWrtsvUMd6SRj6FQHKBTt6xR7ew0m2vPjwtNhRObV2a57he5uaZnxdyrrL0llvSsVS4iZU6F%2FgjoKm%2Fszskedz2%2BbgNZ9btu5gwneTJmjUmU%2BLOEtTYd11KpoGS0gjey47K%2B5OqcaeGpXguWfViZ8z7E3CHKdDHYCHAD%2BroAjio7OTgnyaaETr8w%2FaydOcexG7i2MPL7lxRHe3vrHpN0OqHb6Y72lRnsLpxofzhdTmgRtBVzJ120pSJ3oT0u%2BpY7OltHhwoPIydkvJHECkFXOU6miLv0JqzrA2Vx5nfUpF9JQ9RzfRqkPhMll1qmtR0rrcfbXdwT2ZlwkY3%2BjDqPWqjjM8MtDZ6e7ql%2Fl%2BtP1%2FxP0fm%2BFtsO3ZdgAe8N8Xpw7clGL9CzpiiSK4kiCM8eqBUBeIoOFn1s2qGrcgyrcXK6ZffrzqKupeVuMk0sxa%2BcGVjKqrAE9USSA00EI8CYMqhrC4512hlrXfXcr9zRmnWidbnbMKHT1n01mnXVC0DDmj7NV3KtSXI9X2mMdvAhsZ21A%2BhoK%2FNu04TlST6ApeDN1gLQNHE76zqRVhDcy42zoXzkJBBOkufJC3D1LxOR%2FBeAyostkvn1uLSM3YXVpIxlTIFCbXMbmLzaDiZV1RvJl0kStIwKlqJJmUEnGTlUzWqZxTIy121DCbqHI9aHhtDqX6iyZs%2BzGLY2TuGxerLjRM2auSmlncpYV1Z9yqSRs12PF06G41W8Ph%2BnzHJnVj0BjsbqckzPj0eKbxmbsU5p2taZ8POVwiV11LOH%2BnRGLYbQLERjtjv5ZrzoMFm5qU9deZuMt9YGZBTF70Rr0dqovOtEcRZyk9MhtUYZFyqzTByB3mZb03K5tU3cqeAx7BjDSNLQJQrmHUUOGO3YqaKqy%2FVT1jMhl6XrhTc%2B%2BmI2N3SBFgCS%2FW7btzS6Y7XGR8nu6r31DrjDTduSVTrc1j0R1DIAcC5gSRTyFZhc12msazI4AKAJ9LUmXMlbbgRBnyhZa5ihSozXnZL3Sl3f496Rm9qRJOxvcYYmbyRh4wmrc6rRdCy1CYnDdq7k817YPQ3jy6mCcpKKuz9fc5xiuqLDp0Ost%2BYj4diCtstjrENF0Ri5luudtNbpUCBgordTpvWO1JE5JvuhFl98CwEsJeAhoAF6JBrZyFDstkTqTaxNADiyb5bC2KgnCyMWu6NWn%2B9tKfXImdqJWWrbyEwruInJjtHOwHFTHc%2F6Op7jYDJVd8EKjIfqWKrBkHZcirVOTp2NS9bdsod6vZ%2FLLatt%2BmNZiCp1tRCWWb977rLTObc48RTV9ZaOP21dZL1j7ecL%2FgCy7BIoZcsoFe40aV8ETx7ZXJ23ZXeZJfEsPnZzy%2BfLSRiLG5hYQPQ6LaPPwynPj%2BHEO%2FJ8JxzufCkol4IudUdTdZJkOrOrPIbVZ%2FSWMW1x3fHNIW3Kc2%2Fs27NZZClmP8unaD0lt8JRMg4Xt3eSFLOrOJ267U0NmhGRoy5VniqMNKBwe9ti9tx5dUguZZ7NDuaa94STc97pdYurZA6SijxR3sa9nXAfD6278eVYo94feN%2BciK%2Fiikg0N7gqGvxqAKUbXO8undxpeeBcXR88v63EvpFwr7LsHvmh%2Fc0Y1A%2F5pINXVY3cm8Ym%2FgKdioaYRCnMA3zVp1EQB1EZNe88v%2FYTQ6KYyX38%2FKoHUOBC%2FIjKPEkh%2BaHUBFBhUt95%2FSDyxfcrPN5IXmcdXzU2fpWbt4HuMuTjsNcgIm3eYgjzW4%2BBsSBbHP1vEGlph4HzhXqP9Ib7lXtBEm6XBfprPL%2FHa8xICXwju3CR5MfbK4EAkdcSBT3UbAT4GhvkyH1q7mGIiekaOSSCDha%2F8%2FYhY12tD%2Ftb50GZB1f59hcYOUkZF%2FlZTFw03wtBXvj%2FHsGPqYf3laJuGxaGKXnFJTElljnZcAVw3Rxh%2FPMQHsIoCM9XiJ%2BH8yioUPyTUCYH%2Fr9fxT%2FcZkiDQfh%2FxinARLLMK5T%2F7bzeaN3ZvLw9mN7b0fzB8Wb%2Bfhp%2Fe4ksbj%2FK7QvOPvgH5v6H1wQ7PooI6bevSYntwPimHyLygsfksc50qVfnmXJCGESYtOMysn9C2gW5in8y0kUOr%2FcLDNx%2Fnzh6I%2Fc7nFM%2FidE%2FVyK%2Fuk%2FxXSN%2BlYF30%2Fsvw8%2Bf%2Fgs%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