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="_695e5124-8066-4f13-b4db-2c93ee5f7046" Version="2.0" IssueInstant="2025-07-12T01:14:42Z" 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="#_695e5124-8066-4f13-b4db-2c93ee5f7046"><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>ZRVmuv/gTZmLlDfXhnIbTZuIx37xVYJXS3IYEDOkV8g=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>N0MpvoIvj9oW15VbltRYpNO4230V6S1MDyDg9qjQ+hnwGf6xBEz0v9tIrGNjuQ2vfzkGU6JwVJnj86M40s+V11xn0cGY16+bEGk6WjHRMlYs/UDrLPOOWbBffkxr2hFt/TacVDpJjEPn8jm8VwSciAdcYr3Jh1QTi5Ixa00XfsM4X513/TOk9dDwQDsQmvm24fjeejTSN3f4fDDRRVbHLmpJjkRHEHDLfyM8uLniJa9cDfh9vQRQ4GODwJibIWjcf33eHxKg0MHMoYWiL2F/Unmf5WHLe32RvSpFBeB+vU1+P9RF/5B3CLaYxXM0zJkbpq5gpAAR8C2zoEjkLyAMPg==</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=1VjZkuK4En3vryDoR6LKu1miqya8AQabxcZmebkhbHkBb1je4OuvoKro6uqe7c5MzO0nUEp5dJTKlI785ZcmjloVzFGYJk9t6pFs%2F%2FL86QsCcZQNhLIIEgOeSoiKFh6XoMGt46ld5skgBShEgwTEEA0KZ2AKujagH8lBlqdF6qRR%2B53Lb3sAhGBeYALtlio%2Ftf%2FD9znIUTT70CN5%2FoH1KOZhz7r7B9rpMxByXpdk%2BXbLfiONIbAjQiVUE1SApMAmkuYeyO4DRa9IakCxA5betVsyXkeYgOLmFRRFhgYEUSQheAxdmBRhAR79tHp0LsRwYa5M4sqcJvaYtdNuCW8kpTRBZQxzE%2BZV6EDL0L6CXbHSAlY5vK0SA2IwpSlgnoBIS%2F0waT%2Ffgju48c2ff9PxC%2FF%2B6BcXDczQx%2FzLHL7G1kUvc2OEuq4fa%2BYxzX2CJkmSIPsEHuOi0P%2Fcfv7Uar25Q1dNvPSGJoEkTUIHROHlFhQdFkHqtoTIT%2FOwCOJfwaYIirxiP8DGeXAoNvncJq4zfJ3jRvEPo5HsG9OHOM3h5xyBBxQAmuNfcK%2BoBvQgjo0DW5ahPrU%2F%2F7Ecua1ylYMEeWkeo2%2Bbv8vsmxjCpIJRmkH3Ab0tELP7c4A%2FDNwX4nuOcujjHPiTAcTR%2BXwP21cUG0QlfN4ZdlxWhL%2FaxVoke5sgUferXak2TLext5ONyahbRZ4f7Z7%2FdGP03vlmuO%2FAS%2FNDKt13%2FcVjRupZlarVoZ%2BuKc7eR4WxzWZzlmZImzcpXT7Lfv90WHaCpB55fCMqF7LqF2o%2Bmh3KJV15l%2BPI4ie1PUkOPV5nSdSxKapJSGe0pfjOXhkd%2BfVhbOjRFhGWnGuL%2BXy9Fz3v2OR0MCyIFXBsOZsclEXSO8Q9uzadUHCdbc5MAmq5Cjm1ASS58ZDObjiKIVbzY9%2BV66WMlnEV06x3gPCwMmeMx3qybBj2fqzFGO9ojJWxrHlnvVdqSTgBfUf2gn61NJbsaC7Xk3Cvrg%2BOxzBw3Ex9Uh%2Fr6XYdavSQsJLY49ZjDTK0UZnZUIRip7KozqJvDAlOZCQNbJuNTl4mx3124vxMEIyeRF9S5XDUzoK%2B8J%2Be7qF%2FF%2BtP1%2FhP4fm%2BFxuO7MugAPeGdD24PFzoBXzWVVV2ZUkSorMv1Koo%2BKohLPrI2keuxlK0zirZhvZsblHX8nI7maY7NaicmbBUNHEp1BNZCXVJGAmUpQh1vQNjg3TGOq%2Bd%2B5U7smkntsvtmoocxgi0eMZrFwEOa7KZr5Ral5V6vtIp%2FRAAbDvrB4HTV9bdpovLRjkIS9Gf2aKg69JmxjuxXmDcy42zqX7kJGJOsu8rC%2BHav0wl%2FF8UtK7U8UeyPS535vZC6%2FKJpiyRgIy1Ca2uxoSTquqNlMskDTtmBUrJIqyQS0cOUdP6aUdTCsszQAbu4YiMoSl2%2BheirOnzLAGdtVP4tJFuWUnfzdyM0JsyMdRVn7BI6Gzs8cI5oWSV2OfjlFpuraongtFYW47J%2BfFIdDvmemwQur5xJt35SmXTOu7th8Z0RiyGwCokc7ZtAitZcNSpXNcNr2zS8Wa3Fk4E0d1Ku0VnrXVdJ05OETtpDtludGIjdXaSRkJvvalJpdzsLcRV4Bhx5jCWdXiJwzmnKiGlH7kqrni2n9G%2BBdhTZi%2F88TGQTnPTEElRgErAM8FOJ7ldZ3yU97zRs7eCO1wzO0Ujo03dk4RaEQQwF5EsiflKmFz3CdegIhwEQRfJa064sr9ci6IxUU%2Bd4QlWUmJzZdcvDcNDvSM73cey6N38TF1Zy%2BLaF1fnTCfJRGYwicNmrubzXsQ3w%2BTSVEBJM2n753OOVS1XcrrZEBmd%2BUg8dsDe7SJkAFXVKaVW6q1sG2QkYjDJ36rTeovzyBrjeqill76FKCxlwYeCLpAjyTyNTHXPyDjfpNoSBBbXzVIcm%2FVkYSYSP%2Br0u70NoR1ZS2%2Bopb6JrawC6wRXjH4WHDcz0KxvoDkKJ1NtG66E8VAby7UwJB2XoHeNU5%2FGJe1u6ENte3Ols2OsYKyIcaWtFuLy1OfPPD2ds4umSxC8v3SCaeeiGNzOmy%2B6B%2BF0uoRq2TFLlW0mzEX0ldGerXNGcZenNJklRz7fBd1yEiXSGqQ7QfK5jtnvgmm3OwYT%2F9jtctFwG8hhuRQNmR9NtUl6Mqht5VO0MSM3lLWXbC6whqSlzP1xsJ%2FN4p1q9U%2F5FNpTfCscZfNwcXuNrFq86nA1409NkpKgoy21LlGYWUggZtOhPPa8OqSXMj%2FNDpbd9cXGOW%2BNusNWCgtwRjaEv3ZvJ9zHQ%2BtufDnWiPcH3jcn4qu4whLNDa%2BKBr0ahNINr3eXge%2B0PHSuXR96fluJfSPhXmXZ3fND%2B5s5iB%2FyyQavqhq6N42N%2BwvYFC0pjTOQh%2BiqT%2BMwCeMybt95fh0nRVgx4%2Fv4%2BVUPwNAF6BGWeZoB%2FENoqUBEaX3n9QPPl75f4fFG8rrq5Kqx0avcvE10lyEfp706YWnz5oOZ30YMzAUucfi%2FQWTlPgqdL8R7pDfcr9wLHPB9WcC%2FxvN7vNYMp8A3sgsVaX68vRIwEH4tEcCH7VaIrr5hDt2ntgcihE1XzyEWdKD4nbcPnutqffBugwdlHl7l219g5KRlUuRnKXXh3BPDvAj%2BPYIfQw%2FuO0XcChZEGX7FpQkhlTkuuEJw3Rwi9PMQHoI4jM5XiJ%2BH8yisYPKTUMYH%2Fr%2BfxT8sM6iDMPo%2F4xQiLFnmFcz%2Fdl5vtO5sXt4eVO%2FtaP7Q8Wb%2Bfhl%2Fe4osbj%2Fq7QuOF%2F4Da%2F%2FDe4KcAMaY9NvXpHTvgOSmH2L8gkf4sU7xxGvnmXAiEMYIt5My3v%2BEtAt8Ff9kpIscXO8XELr%2FPnH4Ru53OGdBmsB%2FLkV%2BtU7RXSN%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