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="_8d45d5c6-fbca-4119-8e52-51f913be34e0" Version="2.0" IssueInstant="2025-11-21T05:04:24Z" 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="#_8d45d5c6-fbca-4119-8e52-51f913be34e0"><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>INSQnfYaPzH6TNEsJthwDCtX15KzBFlCLWfFhr4BlAQ=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>DS4225c/HeJzZMsXjyLEcaopoiljzOVK4/2JSDmdsSvKhQqJkSwRPTU8bCrMZnJl8yWw3VUMnm5EyBpWlwRH64CwBv3V8VosbCEZ2Vulaz0X4NeUj53veOJI1K2wevB9JzxqPuqTvpC5yTWPQ6mtSmaetsIYQpmbPcTei57Z1NETkvWzyodqbA/4P03Y9y6/ivLJL7zteQ+CoqrW9D/UPGZttttoACzaF6JbbEmej8s87kCZ9e9VdP1sOLbmXYE4uIX7cCa9TwkMfB12+mUGDUgTj5azlZ1tkpFUZ6hyGLIeyqlfZ3LeV4Yh1ze4Zs8xBFlF+Zad0mss+I7MbiJLAw==</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=1VhZc%2BK4Fn7vX0HRj1TiBRsDlWTKG2CwWWzM4pdbsi1sg3d5AX79FSTQ6XTPdM%2BdmZrbeSE60vn06egc6ZOffjtGYaOCOQqS%2BLlJPZLN314%2BPSEQhWmfLws%2F1mFWQlQ08LgY9a8dz80yj%2FsJQAHqxyCCqF84fYPX1D79SPbTPCkSJwmb71z%2B2AMgBPMCE2g2FOm5%2BZ%2Buy7Au63QedrYDHhiK6j10IUs%2FsNSuR7Vt2GYg2WysbqQxBHZEqIRKjAoQF9hE0uwDRT3Q1JJk%2ByTTpxmr2ZDwOoIYFFcvvyhS1CeIIg7AY%2BDCuAgK8Ogl1aNzJgZzY2kQF%2BY0YWPWTrPB30iKSYzKCOYGzKvAgaaufgG7YCUFrHJ4XSUGxGDysYB5DEI18YK4%2BXINbv%2FKN3%2F5Q8cn4v3QJxf1jcDD%2FMscvsXWRa9zY4S6rh%2Fr9mOSewRNkiRB9gg8xkWB97n58qnRuLlDV4l3yRVNBHESBw4Ig%2FM1KBos%2FMRt8KGX5EHhR7%2BDTREUecF%2BgEfnwaGY%2BHOTuMzwZY4rxZ9GI5kb04coyeHnHIEH5AOa7bziXlB1uIM4Ng5smLry3Pz8czlyXeUyBzHaJXmEvm7%2BkNlXMYRxBcMkhe4Dui0Qs%2FtzgN8N3BPxLUcp8HAO%2FMkA4uh8voftC8oKhCV8UabGIt5twfw86iynMhoXfi2JxYZiJ2dhEIrqejfwc0YI%2BcXzldF756vhvgOvzQ%2BpdN%2F1Vw%2FJYGiadYgRHJ8tDW32J1V2QJImQbg%2Fz1YThqDHhhS5yKgm%2FiIbH4xany%2FNri3mmhWPw%2B5pXbdXphZHrHwS0nVY66MOI9ZC1V51VwmyRdmiV2UIzuSGmUJzz7YrOBsr1ISuYSX0xudjNi%2BzZZWK7Gm5ni86UWFEABZI2S7SyJ47SxiwnEVN5eWhWp9PiZvZPMHMyfa2d%2BoQQaWOVe5cwEVLTLJ83ZMIcz60CvyX8OIZDDpj25YjuO%2BiLncQrR7srdw5hWaqHW22MlMqG84RQW9ZH7SdQNGtyBxKprfcs%2BAcWlRxSAem1fFPQ1WBpyzcWW0VrpitT50hY6HuEW%2FJoGUBl4wQaimcZgdjla%2Bfn%2B%2BhfxfrT5f4T%2BDpvhcbluxJoAD3hng5uHa40Av4oimK5EqiyIcnj68VgfcUnZ%2F3kGmHrspQtMbI6Yberdh5XUuL7XiSWIpfOVN%2BIavCgq%2FHkhxoIj%2FkKVPm69oCI510RlpHPfUqd7iinWhVbtdU6LR1X42mHfXMw0FNHmdLudYkuZ4tNUrb%2BwDbTtqeZ7WlebdpwuIo7%2FmF4E1XAq9p4mbacSKtwLjnK2dD%2BchJwJwkz5Pn%2FKV%2FkYj4f4FXObHlDaXVqLSM7ZnWpIymTIGAbXMTmJzaDsZV1R3K53EStIwKlKJJmAGbDB2iprXMoimZ6bSBBNz9AekDQ2j1zkRZ06dpDFprp%2FBoPdkyomZN3ZTQjmWsK8seYZLQ2axGcydD8TJenQ4TarE1q64AhiN1MSJnhwPBtYz1SCc0beOMudlSYZI66toDfTIl5gNgFqIx3R59M56zVFau62NH3iSjjbXmM4LgtqI1b61VznWiOAuZ8XGfWsOMCZVpJg757npTk3K5sU3EVuAQssYgkjR4joIZq8gBpR3YKqo6TC%2BlPRMwWbqae6ODL2YzQxdIgYey32n7lkayVmt0kOyO3l1teXewbluySoabuivytczzYCYgSRTyJT%2B%2B7NNI12R%2Bz%2FOaQF5ywpW8xVoQ9LGStQYZrMR4xZacV%2Br6DnUPzMSOJGF39TM0eS0Ja09YnlKNJGOpjUnsNzMln3XDznEQn48VkJNU3P75nGMU0xUdLh0gvTUbCocWsF0OIR0oikbJtVxvpZVOhgIGE72tMqm3OI%2FMEa6HWnztmwv8QuI9yGs8ORSNbGgodlvC%2BSbWJs8zuG4Wwsiox3MjFjvDVo%2Frbgj1wJjakVpom8hMK7COccVoJ95xUx1NezqaoWA8UbfBkh8N1JFU8wPScQnaOjp1Nippd0Pv69VuJrestumPZCGq1OVcWGS9zqlDT2bM%2FMgRRMdbOP6kdZZ11trN5tyez7JzoJQto1SY47h9Fjx5aDN13pbdRZbE0%2FjQyS2fK8dhLK5BYvGix7aMHgcmHDcCY%2B%2FAcWw42PpSUC4EXeoMJ%2Bo4yXRqW3kUrU%2FJDWXa4or1zQFpyjNv5NvTaWQpZi%2FLJ3A1wbfCQTL2Z7d7lBSzozhs3fYmBkmJ0FEXKkcURhoQqL1pUTvmtNwn5zLPpntzxXnC0Tlt9brFVDIDcEYeCW%2FtXk%2B4j4fW3fh6rBHvD7yvTsQ3cYUlmhtcFA16M%2FClG1zuLh3faXngXLo%2B9PyxEvtKwr3Jsrvnh%2FZXcxDf5ZP231Q1dK8aG%2FcX8Fg0xCRKQR6giz6NgjiIyqh55%2FllnBhixYzv45c3PQADF6BHWOZJCvAPoSY8ESb1ndd3PF%2F7fofHjeRl1fFFY6M3uXmd6C5DPk57ccLS5uaDmV9H9I05LnH4v0GkpR0GzhPxHumG%2B4V7gQNulwX8azy%2FxWtMcQp8JbtQkeSH6ysBA%2BHXEgE82GwE6OIb5NB9bu5AiLDp4jnAgg4UP3j74Lku1ofddXC%2FzIOLfPsLjJykjIv8JCYunO2EIC%2F8f4%2Fgx9CD%2B04R14IFYYpfcUlMiGWOC67gXTeHCP06hAcgCsLTBeLX4TwMKhj%2FIpTxgf%2FvZ%2FF3ywxqIAj%2FzzgFCEuWWQXzv53Xjdadzevbg%2BrejuYPHTfzt8v421Nkfv1Rrl9wdsE%2FsPaf3hPk%2BDDCpG9fkxLbAfFVP0T4BY%2FwY53CT8vXzhPhhCCIEG7HZWT%2FgrQLfBX%2FYqSLHFzuFxC4%2Fz5xeCP3A86pn8Twn0uR361TdNeIX2Tg3fT%2By%2FDLp%2F8C"
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