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="_c6d13e04-ffe0-44c7-ba55-ed73b3f243b5" Version="2.0" IssueInstant="2026-06-09T18:01:48Z" 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="#_c6d13e04-ffe0-44c7-ba55-ed73b3f243b5"><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>YrJvL4xzByZQ7jNTET9HbEthTDwD1xpN2I9vOGnjdD4=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>pcfvy/sK0p3D/z9setzOuAyBlKOUQXNXcGReXDBdjIePkqHwdameZOaADVsL/Z09CycajVA+TFnlHNXrHkoaSv8HiR9pS9YrYQYKYbHEWtKucFUGSf+kcdRkZLCa30h28oJGQljhfenOuCfMSZneS4yu+QUI9zShlrJ2UyC3C+bbtfGdlWcLSvq3WAFWI3Pv6RCGRpFDSzY+cMET+f8RSJ/Fs+cuNv6NKkhWPSD0Q5aV7YkmujK5uZoKiGY73r3dWQe25kVqRENI4iNYA+135qDz56lpnFodeRc4S+xQuy8sWbKBxVwLuY13iqgBSsMdQmocdaAk5tDNNDKVRUwraA==</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=1Vhrk6K6Fv0%2Bv8JyPlLdgICvmu5TvFQUUEBU%2FHIrQgSUd3iov%2F5Gu9vp6ZnzuuecOnequsrOTvbKys7eyQpffjnFUauGBQrT5KlNP1LtX54%2FfUEgjrIhX5VBYsK8gqhs4XEJGt46ntpVkQxTgEI0TEAM0bB0hxavqcPOIzXMirRM3TRqv3P5bQ%2BAECxKTKDdUqSn9n%2FcrkczkGIf9ntIPbCs23vYAY57gF6P2TH7DsvsuHZr9UYaQ2BHhCqoJKgESYlNVKf7QOG%2FwZLuDyl6yPa37ZaE1xEmoLx5BWWZoSFJlkkIHkMPJmVYgkc%2FrR%2FdCzlaWEuLvDLvkDvM2m23%2BDeSYpqgKoaFBYs6dKFtql%2FBrlhpCesC3laJATGYfCphkYBITf0waT%2Ffgju88S2ef9PxC%2Fl%2B6BcPDa3Qx%2FyrAr7G1kMvc2OEpmkeG%2BYxLXyyQ1EUSQ1IPMZDof%2B5%2Ffyp1Xpzh56S7NMbmgiSNAldEIWXW1A0WAap1%2BIjPy3CMoh%2FBZsmaeqK%2FQBP7oNLs8nnNnmd4escN4p%2FGI1i35g%2BxGkBPxcIPKAAdLjuC%2B4V1YR7iGPjwpZtKk%2Ftz38sR26rXBYgQfu0iNG3zd9l9k0MYVLDKM2g94DeFojZ%2FTnAHwbuC%2Fk9Ryn0cQ78yQDi6Hy%2Bh%2B0rygpEFXx2immtsqeLcN4avYO%2BlJeDyU4ug6XUSPQp0zvKoJ6Pk4MnsU83Ru%2Bdb4b7Drw0P6TSfddfPDJ3X59JNKMyRiIvAwTLy7ziz0I0m9vGRt%2B4YxNuJME7KHBxzCeNh5N%2BOwe8tEIquaUG4tkFhxVPLEdJNNE3xeSYAqvuT0JzkFkDp3AMZ%2BbsJvK6nFXuyB5be%2BLoeuZxq4qAoYJOP52OjegQ7GEyr8S9Zm0TaLHnijBsZXCxgqiYduyzyIjEblfux160dlWrzpk1P1orzKLumuLYzEaSdXEIV5OXxL5vWlNyhAi30uuuPjsG64UlUQYHVj3nGFeHGVdt01k4dnpMwXhrA3a44yo3ZV1hQ93hCZrhcunCdaMsGaUeNF3WIk5Gde6j9W4mnFaNWjk0E%2Ba%2BYCHNM%2BLU9QB%2F5EpJ16XZyrSbAvBPT%2FfQv4v1p2v8Z%2FB834sNRw0kUIJ7Q7weXHtc6CV81hRF8iRR5KOzzzeKwPuKyS8GyN5FnsrSHY2Vs01nv%2BIWTSMZznSWbpWgdnXekFXB4JupJIeayI952pb5ptmCiUm5E62rnge1N1513HhVOWs6chkzUGO9q154OGqo03wpN5okN%2FOlRmuHAGDbWTvwnLa07zZNME7ygTcEX18JvKaJG73rxlqJcS83zpbykZOAOUm%2BLy%2F4a7%2BRivh%2FgVd7IuGPpdWk2lrOpaNJeYe2BRIy9ia0eyoTTuu6P5Yv0zQkrBpUok3aIZeOXbLpaPm2Q8tslwES8A5HZI4sgRhcyKrpnPUEEGu39Dtm6rCittW9jNROVWIqywFpU9DdrCYLN0fJMlmdjzPacOy6L4DxRDUm1Px4JHuEtZ6YpKZt3GlvvlTYtIn7u5E508nFCNilaOnOKbCTBUfn1bo5deVNOtls13xOkj1H3C6Itdrz3DjJI3Z6OmTbcc5Gip6LY76%2F3jSUXG12NuJqcIw4axRLGrzE4ZxT5JDWjlwd1112kHV8G7B5tlr4k2Mg5nPLFCiBh3LQZYKtRnFbYnKUdl2zv3J4b7RmtrJKRZumL%2FKNzPNgLiBJFIolP73u08TUZP7A85pAXXPCk3xjLQjmVMmJUQ5rMVlxVc%2BvTHOP%2Bkd2toslYX%2FzszR5LQlrX1ieM42iEonBJA6buVLM%2B1H3NEoupxrIaSY6fz7nWMX2RLeXjZBJzMfCkQA7r4eQCRRFo%2BVGbhxpZVKRgMFE31FmjYPzyJ7gemjEl76FwBsS70Ne46mxaOVjS9kxEs43sbF5nsV1YwgTq5kurETsjolBr78h1SNrayfa0DaxndVgneCK0c6862Um0gcmmqNwOlOdcMlPRupEavgR5XpkZ3tym3xSdbxN59Cs9nOZ2DJ2MJGFuFaXC8HIB91ztzObs4tTjyS7vuEGM%2BIim9x2P1%2F0DnyeX0KlIqxKYU9T5iL48njHNgUje0aeJnpy7BbboFdNo0Rcg3TLiz5HWIMemPV6EzD1j70eF42cQAorQzCl7nimTtPcpJ3apzumTm1oeyeuuMAeUbY89yfBTtfjrWIP8mIGVzN8Kxwl63Dx%2BidJsbuKyzWMP7MoWoSuaqg9srSykETMhqD37Hl5SC9VkesHe9XzhZN7dsyGYGuZBTgjT6S%2F9m4n3MdD6258OdbI9wfeNyfiq7jCEs0Lr4oGvRr4yguvd5eJ77QidK9dH3p%2BW4l9I%2BFeZdnd80P7mznIH%2FLJhq%2BqGno3jY37S3gqW2IaZ6AI0VWfxmESxlXcvvP8Ok6MsGLG9%2FHzqx6AoQfQI6yKNAP4h1RTnozS5s7rB54vfb%2FC443kddXJVWOjV7l5m%2BguQz5Oe3XC0ubNBzO%2FjRhaC1zi8H%2BDyKpdFLpfyPdIb7hfuZc44LuqhH%2BN5%2Fd4LR2nwDeyC5Vpcby9EjAQfi2RwIftVoiuvmEBvaf2HkQIm66eIyzoQPk7bx8819X6sL8NHlZFeJVvf4GRm1ZJWZxFrDLmeyEsyuDfI%2Fgx9OC%2BU%2BStYEGU4VdcmpBiVeCCK3nPKyBCPw%2FhEYjD6HyF%2BHk4j8MaJj8JZXzg%2F%2FtZ%2FMMygxoIo%2F8zTiHCkmVew%2BJv5%2FVG687m5e1B99%2BO5g8db%2Bbvl%2FG3p8ji9qPcvuDsw39g7X94T5AbwBiTfvualO5ckNz0Q4xf8Ag%2F1uku%2Bdp5Jt0IhDHC7aSKdz8h7RJfxT8Z6bIA1%2FsFhN6%2FTxy%2BkfsdzlmQJvCfS5FfrVN014hfZeDd9P7L8POn%2FwI%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