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="_57234b6e-621f-427a-ab7f-1d0345ea6de4" Version="2.0" IssueInstant="2026-03-10T11:43:51Z" 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="#_57234b6e-621f-427a-ab7f-1d0345ea6de4"><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>fje8CdupqWvzXG2zPS6xRlJ9PKJL/s+T1WjEQj1KTNk=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>pnSs/+ji4ws0sa6p9ZmJQhe8CN7KzkEIyA9HiL8NEopPpLKoEo7tFplgZGEAJbQIZFXyFX3x6cu/WdMh8AHYljH/mRd9SGCxHZYFlPFvpGKhqQlZ0oBMgtraM1kBjmCQDjBGmqqBf6dcXgXz7810/WoJkJqFFhb5oAeoVPfcXjJKZU0fib3pJW7q78L9jcn3UdULFmjTbaOBkEVqSm/ElDOGaYXDuL/e0bSYrsi1OKuWbnJo3WNsRZom+QAW9vEbDq5wJUremK1KtcO/PlkhCEg2h6XsEbUa8yX3yUkXJ+I22xJJgaQQo7EcDMkkb3npG7/okqYcNMF9pgP20lAtBA==</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=1Vhbl6K4Fn7vX%2BGyH11VXERQV1fN4qaC4AVE0ZezAkRAuQdE%2FfUnWqVdXX2Z6TMzq08%2FaXayv3zZ2dn5wqc%2FjnHUOMAChWny1KQeyeYfzx8%2BIRBHWZ%2BvyiAxYF5BVDbwuAT1rx1PzapI%2BilAIeonIIaoX7p9k9e1Pv1I9rMiLVM3jZpvXH7sARCCRYkJNBuK9NT8T4ej24zDwgeWprYPDM2BB%2BBw2wfKI9tMBwLWg0yzsbyRxhDYEaEKKgkqQVJiE0mzD2T7gSIXFNVn2v0OtWk2JLyOMAHl1Ssoywz1CaJMQvAYejApwxI8%2Bunh0T0Tg5m5MIkLc5pwMGu32eBvJMU0QVUMCxMWh9CFlqF9BrtgpSU8FPC6SgyIweRjCYsERFrqh0nz%2BRrc%2FpVv8fxDx0%2FE26GfPNQ3Qx%2Fzrwr4GlsPvcyNEeq6fqzbj2nhEzRJkgTZI%2FAYD4X%2Bx%2Bbzh0bj5g49JdmmVzQRJGkSuiAKz9eg6LAMUq%2FBR35ahGUQfwebIijygv0Aj%2B6DSzHJxyZxmeHzHFeKfxmNZG5MH%2BK0gB8LBB5QAOgO%2B4J7QTXgFuLYuLBhGcpT8%2BNfy5HrKhcFSNA2LWL0ZfNPmX0RQ5gcYJRm0HtAtwVidj8H%2BM3AfSK%2B5iiFPs6Bnwwgjs7He9g%2BoyxBVMHn7Q52Ra%2FK8tXhbA%2Fp88xkj0ak9mZjVSNQa0GtdvJ8R40Xk%2F3TldFb56vhvgMvzXepdN%2F1F48sMRHR2oVMjUgE2Ky3idV5gClMuPF5LysnvjcKte5ETrNZpo1TOeXKQRb5m6HMq85c2Qzs08BuH1m3IlaeHnT50TrajYjY8HrmUDyONutBNBscsuE4yOfRhkwF3S8LoFN7YReLc2knDOM8F7as59q%2Bfea6OPKrVN2r%2BWAQOJ2Uh%2BlytnXtnTreWOQ2dNqZuuJyrqv1dm7StjxLG8S7hQOmwl5e5mZMyJE0HYK1LVUaAUnHXOPqQ03H1cpJ1LS9miBjk8atOb%2FqHWRHyju1ahUwHlPj0p0Ss2gfiLJPB6yNZMcC3ZPdPll7W20pNH1UVR%2FM5yknu5K%2B3zvtJBtyRLrP1%2B5EH%2FQyf0aTEV8K%2FNPTPfRvYv3hEv8xPN33wu6QPQmU4N4QL4Vriw96CZ91RZE8SRT56OTztSLwvmLwsx6ynMjTGIrWGTmz6e2yM6trab5Wx%2BlGCQ7uhJ%2FLmjDna1WSQ13khzxlyXxdb8DIIN2Rzmqn3sEbLmk3XlbrFRW5bSPQ4gmrnXk4qMnjdCHXuiTX04VO6bsAYNtJ3%2FEdfWHdbbowP8o7fi74k6XA67poT1g31kuMe75yNpX3nATMSfJ9ecZf%2BuepiP8LvMaJLX8oLUfVxlyfaV3KacoSCNi27NDitHaoHg7doXxW07BlHkAlWoQVdtKhS9S0nm9oSmbYNpCAt9sjY2AKrd6ZqGr6NElAa%2BWWPm2ka0bUNxMvI%2FRjlRjKokdYJHTt5Wjm5ihZJMvTfkzN19ahK4DhSJuPyOl%2BT3AtczUyCF23XZWbLhQmreOuMzDGE2I2AFYpmpP1MbCSWYfKq1V9ZGU7HdmbFZ8TBLcWN7PWSuM8N07yiFGPu2wzzJlImeTikO%2Bu7JqUK9uxUOcA9lHHHMSSDs9xOO0ockjp%2B84hPrBML6N9CzB5tpz5I5yV%2BdQ0BFLgoRyw7WCjk51Na7SXHNboLte8N1i1N7JGRnbdFfla5nl8IpAkCsWCVy%2F7NDJ0md%2FxvC6Ql5zwJH%2B%2BEgRDVfLWIIcHMVl2Ks6vDGOLuntm7MSSsL36mbq8koSVLyxOmU6SidTGJHb2VCmm3Yg9DpLz8QBwfRDXP59zjGJ5ostlA2S0pkNh3wKOxyFkAEXRKbmW67W0NMhIwGCiv1bG9RrnkTXC56EWX%2FpmAj%2BXeB%2FyOk8ORTMfmorTlnC%2BibXF8ww%2BN3NhZNbqzExEdtjqcV2b0PaMpR%2BpuW7HVnYAqwSfGP3Eu15moEnPQFMUqmNtHS740UAbSTU%2FIF2PoDdHt85HFe3Z9K5ebqdya9O2gpEsxAdtMRPmeY89sfR4ysyOHEGw%2FtwNxq2zbHQ22%2BmM2%2FF5fg6VqmVWCnNU22fBl4cOUxdt2ZvnaTJJ9myxCbhKjRJxBdINL%2FqdltnjwJjjRkD19xzXiQbrQAqruWBI7HCsqWluUOuDT9HGhLQpyxGXncAakJY89UeBM5nEG8Xq5cUYLsf4VthL5u7sdY%2BSYrGK26nb%2FtgkKRG62lzjiNLMQgK17Ra1ZU6LXXquinyys5acLxzd09qoW8xBZgDOyCPhr7xrhXtftO7Gl7JGvC14X1TEV3GFJZoXXhQNejXwlRde7i4D32lF6F663vX8WIl9IeFeZdnd8137izmIb%2FLJ%2Bq%2BqGnpXjY37S3gsG2IaZ6AI0UWfxmESxlXcvPP8PE6MsGLG9%2FHzqx6AoQfQI6yKNAP4h9BSnojS%2Bs7rG54vfd%2FhcSN5WXVy0djoVW5eJ7rLkPfTXpywtLn5YObXEX1zho84%2FN8gssqJQvcT8RbphvuZe4kD7lQl%2FHs8v8ZrTHAKfCG7UJkW%2B%2BsrAQPh1xIBfNhshOjiGxbQe2puQYSw6eI5wIIOlH%2Fy9sFzXawP2%2BvgflWEF%2Fn2Nxi5aZWUxUlMPTjdCmFRBr%2BO4PvQg%2FtOEdcDC6IMv%2BLShBCrAh%2B4kve8AiL0%2BxAegDiMTheI34fzMDzA5DehjAv%2Br8%2Fibx4zqIMw%2Bj%2FjFCIsWaYHWPzjvG607mxe3h5U91aa33XczF8v4x9Pkdn1R7l%2BwdmG%2F8La%2F%2FKeIDeAMSZ9%2B5qUOi5Irvohxi94hB%2FrFEu8dp4INwJhjHA7qWLnN6Rd4qv4NyNdFuByv4DQ%2B%2FXE4Y3cn3DOgjSB%2F16KfPecortG%2FCwD76a3X4afP%2FwX"
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