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="_8ea221a2-7a59-4c74-ac5e-8b894aa1b46e" Version="2.0" IssueInstant="2026-01-20T07:46:36Z" 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="#_8ea221a2-7a59-4c74-ac5e-8b894aa1b46e"><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>KmhwL4K5tiMdpYx5rtvC+kW2YOoJ4uYwxvrA+J//E/8=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>ExbhmvDvM0l5HyLGFpw1gM/2TY3EzH6KV9w4oOhbw6eQDDUh260E+6hI4PoWOOvMSASJwbKrg0uVLR3VAMX61aj395+mHUeYqkLNIWXdm1EnXrJDwfyxpt1QdeI98IYRDT1WV6zycM1woB5HYulm6oe8/MMF6B+bt7uEFpo4NQWTR20YvodcQSjJDj2KTOUB0iDCmkXKRoEYBTRHmrUtnvzs4QLLlyibl3wkDKNSIKTTAnNA0SfSult28eMWiMJOPsAfR/vJIOo5Hyl6t9qKHh90o14GuU6xSe+DncB9L9PRTJgPKd1u2LJ9qbMSGxuAMweJmLPJamPNMT1L5K8Xnw==</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=1VjZkuK4En3vr6igH4kqL9hmia6akBewwWaxMdvLDWEL2%2BBdXoCvv4Iq6Orqnu3OTMztJ1Cm8ugolZKO%2FOWXYxQ%2BVCjHQRI%2FN5gnuvHLy6cvGEZh2gNl4ccmykqEiwfSL8a9q%2BO5UeZxL4E4wL0YRgj3CqdnAUPvsU90L82TInGSsPEu5LcjIMYoLwiBxoMmPzf%2B00GQZRnIPrYh333knDb3CB0ePXa2nS4HIbPlBNR4WNxIEwgSiHGJtBgXMC6IiWaFR5p5ZOk53e5xQq8lbBoPMplHEMPiGuUXRYp7FFXEAXwKXBQXQQGfvKR6cs5Uf2rNLerCnKW2hLXTeAA3klIS4zJCuYXyKnCQbepfwS5YSYGqHF1nSQAJmHIsUB7DUE%2B8IG68XJPbu%2FLNX34z8Av1vusXF%2FeswCP8yxy95dbFr2MThLqun%2BrWU5J7FEvTNEV3KdLHxYH3ufHy6eHhFo5cLd4lVzQJxkkcODAMztekGKjwE%2FcBhF6SB4Uf%2FQo2QzH0BfsRHZ1Hh%2BHizw3qMsLXMa4U%2FzAazd2YPkZJjj7nGD5iH7K88Ip7QTXRDpHcOOjBNrXnxuc%2FViPXWc5zGONdkkf42%2BbvMvsmhyiuUJikyH3EtwkSdn8O8IeJ%2B0J9z1EOPFIDfzKBJDuf72n7irKAYYleRpFf69yILwLDTddHPi8qqXlYsutJMuTKdX2sctAcUpRCdZ6vjN4HXw33FXhtfiil%2B6q%2FRijHrR9VcmXQIa%2Be9EE%2FrRnPoNj5uqWcVWG06NZcMvG3tYBmsmz7rEArTcHXuGmynEwqwwLWsN6Oco8uF7rZWgBjJTBw3%2BryzUi10To76GNtuXIjRolX%2BVCud6djWjAzF2ndjrY25TmzXAjnk2MwdSLy6roMIyFBHcow%2BoLY3BbtUumnCTeeLecmS6%2BrxHVm1n4o79nRfGKLdCBL0WE1MhNlLc5NNcrtIq7OmJvpengKtmGrPsijsaWN5nMQjwFt7awyLNgOMpaBMZxMMdiZVDXUJgmZfygU3Wyk%2Bl06YbhBaQtHCzXl2BG7endqzofedOQyJasPu9nWsAbHEhg1Gkb6dAij6diYMzo%2F6qzi%2Bvn5nvp3uf50yf8Ine5rseLprgwLeG9Il4NrRzZ6gV4MTZNdWZJAePJArYnA00ww7WJ7G7o6x7AGp6Qrdrfgp3Utz9bDUbLR%2FMoZg5miizNQD2UlMCQwAIytgLreQNWkHdUQ9FO3cgcL1okW5XrJhE7L9PVoLOhngPo1fZzMldqQlXoyNxhj70NiOxl7wBtz%2B24zxNlR2YOZ6I0XIjAMaTUWnMgoCO75ytnSPnISCSfZ85QpuPhniUT%2Bi0BvS01vIC%2FUcmOtz6whZyxjixRq2avAbuutYFhVnYFyHiZB06pgKdmUHfDJwKFq1sg2LKNwQgvK0N0fsNm3xGb3TJU1exrHsLl0Co81kzUnGZuxm1LGsYxNbd6lbBo5q4U6dTIcz%2BPF6TBiZmu76ohwoOozlZ4cDlS7aS1Vk1Thyhm2J3ONS%2Bqos%2B2bozE17UO7kKzx%2Bujb8ZRnsnJZHwVllairzRJkFNVeS5tpc6m3XSeKs5AbHvfpZpBxoTbOpAHoLFc1rZSrrY35Ch5C3upHsoHOUTDhNSVgjANfRZXAdVPWsyGXpYuppx58KZtYpkiLACm%2B0PI3Bs1vmupB3gpmZ7EGbn%2FZ2ig6Ha7qjgRqBQA4EbEsifkcDC%2FrpJqGAvYAGCJ9qQlX9mZLUTSHWtbsZ6iS4gVftr3SNHe4c%2BBG20gWd9c4y1CWsrj0xPkpNWg6lluExH410fJJJxSO%2Ffh8rKCSpNL6z9ccp9mu5LTTPjabk4F4aMKt28bYhJpmMEqt1Gt5YdKhSMAkb62N6jWpI1sl%2B6GWXn1TEcxk4CFgAHogWdnA0rYtmdSbVNsAcGTfzETVqodTK5aEQbPb7qwo%2FcDZxpGZGavITiu4jMmOMU7AcVMTj7smnuBgONLXwRyofV2Va9CnHZdiN0enztSSdVfsvl7sJkpz07J9VRGjSp9PxVnWFU4CO5pw02ObogRv5vij5lkx%2Bc1uMm3vQZadA61sWqXGHYets%2Bgpgy1X5y3FnWVJPI4PQr7x2%2BUwjKUlTDZA8vim1W3DUbutwqF3aLf5sL%2F25aCciaYsDEb6MMlMZl15DGuO6RVjb6UF79t92lYmnupvx%2BNoo9ndLB%2BhxYjcCgfZ2p%2FdzlHWbEFz%2BLrljSyakZCjz%2FQ2VVhpQOHWqsnsuNN8n5zLPBvv7UXbE4%2FOaW3WTa5SyI3NZUfKW7rXE%2B7joXU3vh5r1PsD75sT8U1cEYnmBhdFg98MoHSDy91lkjstD5yL64Pnt5XYNxLuTZbdIz%2B0vxmD%2BiGftPemqpF71djEX6Bj8SAlUQrzAF%2F0aRTEQVRGjTvPr%2F2kkChmch%2B%2FvOkBFLgQP6EyT1JIfig9AVSY1HdeP4h89f0KjxvJy6zji8bGb3LzOtBdhnwc9hJEpM0thjC%2F9uhZU7LF0f8GkZbbMHC%2BUO%2BRbrhfuRck4duyQH%2BN5%2Fd4D2NSAt%2FILlwk%2BeH6SiBA5LVEQY88RQJ8iQ1y5D43djDExHSJ7BNBB4vfefuQsS7Wx921c6%2FMg4t8%2BwuMnKSMi%2FwkJS6a7MQgL%2Fx%2Fj%2BDH1MP7SlHXDQvDlLzikpiSypxsuAK4bo4w%2FnkI92EUhKcLxM%2FDeRBUKP5JKJMD%2F9%2Bv4h9uM2TAIPw%2F4xRgIlkmFcr%2Fdl43Wnc2r28PpnM7mj84bubvp%2FG3l8j0%2BqNdv%2BDsgn9g7n94TbDjo4iQvn1NSrYOjK%2F6ISIveEwe64xAvTlPlBPCIMKkHZfR9iekXZCr%2BCcjXeTwcr%2FAwP33iaMbud%2FhnPpJjP65EvnVfYrvGvGrDLyb3n8Zfvn0Xw%3D%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