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="_d2da86c9-83d0-4c3e-b9c7-694a1168aa8c" Version="2.0" IssueInstant="2025-07-04T11:21:21Z" 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="#_d2da86c9-83d0-4c3e-b9c7-694a1168aa8c"><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>MogrlR4Gpd77tH5KAWZ9sIuq8mRYsLGP5WHSjGQfxTU=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>r5AHmYRRWkOELp/qYVa9T4BbW7KySYHdMswqiTxMCs69XC9KzKWZF+2cJHZQlnPqQL2jYOka7iRpfZMwGMCFXgrbWGr8qTST2FHvAgzkpsao2zECKMcqt9qzV9lXamcxQVbGjToD/WtuZyZFeotqQqOPBvdG4LFs/n2PkXJ0KB6iR1LSYF62jkLFdpmKayhIXGqVLFMJpzMLpOQXGLKB1N1tjIUDDf5AYahB/eMLkIjdf1nmCQPGrpoCKuBoVhM+wqLhG3JxRSwamTh9BpCfg+1pIPtYXcAkYj/rgTE5+mjxGWbONo7HkFZS49akrSpqc7dkX+cbn4yRABap4B4X4g==</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%2Bv6LL%2BWh18xBFrek%2BxRsUfIAo%2BuVWhAjIm4Cov%2F5Gu3V6eua87jmnzp2qrrKzk72ysrN3ssKXX45J%2FHCAJQqz9LlFPZGtX14%2BfUEgifMhV1dBasKihqh6wONSNLx2PLfqMh1mAIVomIIEomHlDi3O0If0EznMy6zK3CxuvXP5bQ%2BAECwrTKD1oInPrf94tAf6PXfw2O945CPjduDjduCyj70BAyiq1weg77YeljfSGAI7IlRDLUUVSCtsIunuI8k%2BksyCoob05W%2FTehDxOsIUVFevoKpyNCSIKg3BU%2BjBtAor8ORnhyf3TMgza2ERF%2BY0scWs8XTcjaSQpahOYGnB8hC60Db1r2AXrKyChxJeV4kBMZh0rGCZgljP%2FDBtvVyDO7zyLV9%2B0%2FEL8X7oFw8NrdDH%2FOsSvsXWQ69zY4SmaZ6azlNW%2BgRNkiRBDgg8xkOh%2F7n18unh4eYOPS3dZVc0AaRZGrogDs%2FXoBiwCjLvgYv9rAyrIPkVbIqgyAv2Izy6jy7FpJ9bxGWGr3NcKf5hNJK5MX1MshJ%2BLhF4RAGgu71X3AuqCXcQx8aFD7apPbc%2B%2F7Ecua5yUYIU7bIyQd82f5fZNzGE6QHGWQ69R3RbIGb35wB%2FGLgvxPccxdDHOfAnA4ij8%2Fketq8oSxDX8MXI%2FDI2GSX3WLZSu2NutRkgrS76iblGujLrrlRrr8x3x4X9fGX03vlquO%2FAa%2FNDKt13%2FdWj7HJqsjbNVTSV9Jwo1kswWDD8dsWOT9Za9QzUFOHiaAioN3CEwfg8Xm3kNu2O1M08TmfFXKf362kE2NDMdxujUQxBdvxyu1LKfrGwFrSsHjj%2FHOUIZPRZEsaGW1SD4rwcxA5I3ON8uVX2i0wkVlW9OW1kmFXFvJjO%2BIOnMLqMiJSeRc6IHPO90KR0ay336H2ky16ejMEp0BylWOqyMcrPhp5P546ij3lqQlV7zRbFXZdbg4AnoKFH2t7bUWkizGdKmWfCuOazZWC0m0IPlM7oaFoNSBbBgM%2BFnd%2Bmcm1WrR2Xi9Z7ovQXUred7I%2FKajudZKwayRuLGYCotPLCZb3IabvblDmZHA9yhmccxn9%2Bvof%2BXaw%2FXeI%2Fhqf7XjhdciCCCtwbwuXg2uFCr3AiaJroiYLAxSefazSe8zWTmw2QvY09naFog5Fyh94tu7OmEefr0TjbaMHBnXBzSefnXDMSpdAQOIWjbIlrmg1QTdJVjZ5%2BGuDYLmk3WdbrFRW7HTPQk0lPP3NQbsjjdCE1hig104VBGfsAYNvJ2HNdY2HfbQY%2FP0p7bs77kyXPGYbgTHpuYlQY93zlbGkfOfGYk%2Bj70oy79M8zAf%2FPczortH1FXKr1xlqfaUMsaMrGG9axndBm9U44Ohz6inQeZWHbOoBasAk77GaKSzS0UWxoSmJ6HSACbx8hU7b49uBM1A19mqSgvXIrnzazNSMYm4mXE8axTk1tMSBsErrOUp25BUoX6fIUjan52j70eaCo%2Blwlp1FEsG1rpZqEYTjuiJ0uNCZrkv5WNscTYiYDuxKsyfoY2OmsSxX1qjn2JCdTnc2KKwiCXQubWXuls56bpEXMjI77fKMUTKxNCkHh%2BiunIaXa2dqoewBR3LXkRDTgOQmnXU0KKSPqHpJDjxnktG8DpsiXM1%2BNAqGYWiZP8hyUgl4n2Bhkd9NWI3HbM%2FvLNefJq85G0snYafoC10gcB6Y8EgW%2BXHCjyz6ppiFxe44zePKSE57oz1c8b460oi0X8CCky27N%2BrVp7lA%2FYsbbROR3Vz%2FLkFYiv%2FL5xSk3SDIVO5jE3plq5bQf945yej4egJTlwvrP5xyj2Z7gsrmMzPZU4aM22HosQibQNIOSGqlZi0uTjHkMJvhrbdyscR7ZKq6HRnjtm%2FHcXOR8yBkcqQhWoVjatiPifBMam%2BMYXDdzXrWa0cxKhZ7SHrB9h9AjxjaO1NxwEjs%2FgFWKK8Y4ca6Xm2gyMNEUhaOxvg4XnCrrqthwMul6BL05uk2h1rTn0PtmuZtK7U3HDlSJTw76YsbPi0Hv1KPHU2Z2ZAmi58%2FdYNw%2BS2Z3s5vO2D1XFOdQq9tWrTHHUefM%2B5KyZZqyI3nzIksnadQrNwFbj%2BJUWIFswwl%2Bt20NWDBmWRWM%2FIhlu7G8DsSwnvOm2FPG%2BigrTGp98CnanJAOZW%2BFZTewZdKWpr4abCeTZKPZg6Icw%2BUY3wqRaO3PXv8oanZPc7tNxx9bJCVAV5%2FrLFFZeUigjtOmdsxpsc%2FOdVlM9vaS9fmje1qbTZs5SAzAGXkk%2FJV3PeE%2BHlp34%2BuxRrw%2F8L45Ed%2FEFZZoXnhRNOjNwNVeeLm7THynlaF76frQ89tK7BsJ9ybL7p4f2t%2FMQfyQTz58U9XQu2ps3F%2FBY%2FUgZEkOyhBd9GkSpmFSJ607z6%2FjhBgrZnwfv7zpARh6AD3BusxygH8IPeOIOGvuvH7g%2Bdr3KzxuJC%2BrTi8aG73JzetEdxnycdqLE5Y2Nx%2FM%2FDpiaM1wicP%2FDSKvt3HofiHeI91wv3KvcMC3dQX%2FGs%2Fv8R4mOAW%2BkV2oysro%2BkrAQPi1RAAfth5CdPENS%2Bg9t3YgRth08ZSxoAPV77x98FwX6%2BPuOnhYl%2BFFvv0FRm5Wp1V5EjIPTnd8WFbBv0fwY%2BjBfaeIa8GCOMevuCwlhLrEBVdxnldChH4ewjJIwvh0gfh5OCvhAaY%2FCWV84P%2F7WfzDMoMGCOP%2FM04hwpJleoDl387rRuvO5vXtQfVvR%2FOHjpv5%2B2X87Skyu%2F5o1y84u%2FAfWPsf3hPkBjDBpG9fk7KtC9KrfkjwCx7hxzrVI946T4QbgzBBuJ3WyfYnpF3hq%2FgnI12V4HK%2FgND794nDG7nf4ZwHWQr%2FuRT51TpFd434VQbeTe%2B%2FDL98%2Bi8%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