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="_19aa802c-09f3-445b-8b75-aeaa287e8ca2" Version="2.0" IssueInstant="2026-10-17T09:47:39Z" 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="#_19aa802c-09f3-445b-8b75-aeaa287e8ca2"><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>YodYaaVMrSZBK6ZEjcFHIPKEYsF2DZLgcQSu/tlliNM=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>o/NG8ctGvQc3Iwg/GZJNXNtH8OKEawwceFgd83mXi/jamWNgbH6UC2kCiec5F5hU75C9YIwW94vJuyFx7n/q9F+a6bKEunfcRRfOpHb4MpPE5LIrPdYIRwgZWv161l5EBa0nxcluxKH3V/nsepnllNFwMmFXZ8n7Bd2qGQd3PtDJ3z2ZSUlu3PhjS479riKjtR8eiqIfoVW9MhmDPa5o6fKE2CeRqzqPknR2Nbm4EsSBENXcScv8ko0JR6Q6bLNo3+QQcwzcsqNiKtOqLJ5Dcpnb72+caALUZpW6iPJfPqo+3sOhgOkUF6UpnRTAFLIbHS0ppNajoAy6kuUS5HLPSw==</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=1VjZkuK4En3vryDoR6LKC8YGoqsmvGKDbcDGbC83hC2MwLtsDHz9FVQVXV3ds92Zibn9BEopj45SqdSRv%2FxyiqPGERYYpclTk3mkm788f%2FqCQRxlfbEqd4kD8wriskHGJbh%2F63hqVkXSTwFGuJ%2BAGOJ%2B6fdd0TL77CPdz4q0TP00ar5z%2BW0PgDEsSkKg2TCUp%2BZ%2FmB4AXZr1H%2Bjetv3AcZ3NQ3cjdB4ABIDtCrDrA7bZmL%2BRJhDEEeMKGgkuQVISE83yDwz9wAgzutfnhH67t242FLIOlIDy5rUrywz3KapMEHhEAUxKVILHMD0%2B%2BhdKm7gzl7oyZ6kNYe03G%2BIbSTlNcBXDwoXFEfnQc8yvYFestITHAt5WSQAJmHoqYZGAyExDlDSfb8Ht3%2FgWz7%2Fp%2BIV6P%2FRLgPsuCgn%2FqoCvsQ3wy9wEoa7rx7r9mBYhxdI0TdE9iowJMAo%2FN58%2FNRpv7jAwkm16Q5NBkibIBxG63IJiwXKXBg0xCtMClbv4V7AZiqGv2A%2Fw5D%2F4DJd8blLXGb7OcaP4h9Fo7o3pQ5wW8HOBwQPeAbbDv%2BBeUR24hSQ2Pmx4jvHU%2FPzHcuS2ylkBErxNixh%2F2%2FxdZt%2FEECZHGKUZDB7w2wIJuz8H%2BMPAfaG%2B56igkOTAnwwgic7ne9i%2BosxBVMHnVRqsAJhbhbuWRvxa3fuabkxG6gprrLI2Q3%2FqVlQZRci2nm6M3jvfDPcdeGl%2BSKX7rr94pJQ96Prl4Dj120YdUoP10F7apd4dj1RQ1z7UwqDbjpeI2oN4YYcbnfdk9iAj6He0zs4TOnJvZdSLHnccVmftJCRU3tNagN%2BM1CrZ%2Bo6zHWf6hrOyidoxjWISrAynDteLI8MzUUeVAJ2c%2FKg6jfT2nEowzJIosrXairXlupsIUsDmg2nQnpTKsH1h164XVe3Jbu9yQq9Ao33pdCHKjW06X%2FSsXaxMQCfltyOVlaGTX%2FLJIXFYexNzKnYl1V76rn%2FsHlJ66PBTfmPaabs1nfr1xce5jUblODeHHcXPko3Atnwgmt46W%2FBoMtxO8rTVxuNdOD54Gu9liTMTNdPY6C6dZTbYp%2BKZP1Se29HNiVs%2FPd1D%2Fy7Wn67xH8HzfS%2BWHbqngBLcG%2FK1cG3JQS%2Fhs2UYSqDIshidQ7E2JDE0HHHSw94mCkyOYS1OzZbsdt6Z1LUyXQ1H6drYHX1bnKqmNBXroaIiSxYHIuOpYl2vge7Qvm7x5rl3DAZz1o%2Fn1WrBRH7b2ZmxzZsXEWo1fRrP1NpS1Ho8sxhrvwPEdrb2YseaeXebJU1P6l6cSqE9l0TLkpc278dWSXAvN86u8ZGTRDgpYahOxGv%2FNJXJf0k0BbkVDpS5Xq3d1YW1lJxlPImCbW%2BJPMFso%2BHx2B2ol2GKWu4RVLJHeaiTDnyqZq18zTIqx7eBAoL9ATuaK7V6F6qq2bOdgNbCL0PWSVecbK3tIKOsU5U4xqxHeTT0l3N94uc4mSXz82HETFfesSuBgW5OdXp8OFBCy13oDmVZS38ojGcGl9Zxd6M5I5uaaMArZddenXZeMukwebWoT7y6TPXleiHmFCWs5PWktTCFwI%2BTPOKGp322HuRcZNi5PBC7i2VNq9Vy4%2BHOERyijqvFigUvMRp3DBUx1qFzjI8818vY0ANcns0noX7YyfnYdSRaEqG649u7tUV31i39oGx4pztfiYG2aK9Vk46WdVcWa1UUwVjCiiwVM3F43SfdsVRxL4qWRF9zIlDC6UKSnKGRt7QcHuVk3qmEsCIHFncP3GgTK9L25uda6kKRFqE0O2cWTSdKm5DYL8dGMe5G%2FElLLqcjUNNMXv35nOMML5B9IdOw0xoPpEMLbAIBYwcYhsWotVqvlLlDRxIBk8OVMapXJI88nZyHWn7pm0jiVBFDKFoiPZDdfOAam7ZC8k2uPVHkyLmZSrpbDyduIvODVk%2FoLinzwHnWiZlay9jLjmCRkBNjnUU%2FyBxs9xw8xmg4MldoJuqaqSu1qNF%2BQLHrk1%2FnesUGS3Zfz7djtbVueztdleKjOZtI07zHn3l2NOYmJ4Gi%2BHDq70ati%2Bp01tvxRNiLeX5BRtVyK4M7kWImhepgw9VFWw2meZrYyYEv1juhGkaJvADpWpTDTsvtCWAkCDoYhgdB6ETaaqegaio5Cj8YmcM0d5jVMWRYx6aXjLeR56Qma7SnjkN9t7HteG14vbwYwfmI3AoHxd1fgu5JMTze8Dt1Oxy5NCND35yaAlW6GaJwe9littx5tk8vVZHbe28uhNLJP6%2BcusUdVQ6QjDxR4SK4VbiPRetufClr1PuC901FfBVXRKIF6Kpo8KtBrAJ0vbsccqcVyL92fej5bSX2jYR7lWV3zw%2Ftb%2Bagfsgn67%2BqahjcNDbpL%2BGpbMhpnIEC4as%2BjVGC4ipu3nl%2BHSdHRDGT%2B%2Fj5VQ9AFAD8CKsizQD5ocxUpKK0vvP6gedL36%2FweCN5XXVy1dj4VW7eJrrLkI%2FTXp2ItHnzIcxvI%2FruhBxx%2BL9BZNUmQv4X6j3SG%2B5X7iUJ%2BKYq4V%2Fj%2BT1ewyYp8I3swmVaHG6vBAJEXksUCGGzgfDVFxUweGpuQYSJ6eqpEUEHyt95%2B5C5rtaH7W1wvyrQVb79BUZ%2BWiVlcZbTAI63EirK3b9H8GPowX2nqNuBBVFGXnFpQslVQQ5cKQZBATH%2BeQhrIEbR%2BQrx83AeoCNMfhLKpOD%2F%2B1n8w2MGLYCi%2FzNOCBPJMj7C4m%2Fn9Ubrzubl7cF030rzh4438%2FfL%2BNtTZHL7MW5fcLboH1j7H94T7O9gTEi%2FfU1KNz5IbvohJi94TB7rDE%2B9dp4pPwIoxqSdVPHmJ6Rdkqv4JyNdFuB6vwAU%2FPvE4Ru53%2BGc7dIE%2FnMp8qvnFN814lcZeDe9%2FzL8%2FOm%2F"
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