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="_1541a0ab-2d3e-45a4-914b-b1b6ec71fced" Version="2.0" IssueInstant="2026-09-09T10:17:53Z" 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="#_1541a0ab-2d3e-45a4-914b-b1b6ec71fced"><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>7YUjsR10W79ri5tUH2iYCEG9Err78xQrRDhrOsqUU2c=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>Mf3OJRdHYhCL4QUhcF/N8xw+dR+CI+gkzlN4z1Ruxgv7/YOKm/BrrBtp0AjWxrwMzV77Bs7vU2zFlHsT6nm7xnBUnLyoNIy96x9D054sYI7leZgEe5TSAkO3DB8M4omiLtkl2q0AJ65FlVM27v+5IpnbLVEOy9BnFUfyjV9OCC8BLRCfVvsz/LhJQzNyuGoEOwNArv813GhP5PY8bm0gPsIxvwFRMizH1VM1O4BLWrHRwvJvJOBICZ1CuKSOwYZ3N7Z+3y9h6OtYkTRFXN8VZXLk3xwYvgMhZ4h+RKIWDl7U8EsEQVb6rtuARPdXkHboBZs35Cxdz/cUfgWcSVMmtg==</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=1VjbcuK4Fn3vr6DoRyrxBRsDlWTKN8BgY7CxAb%2BcErawDb6A5Rt8%2FREk0Ol0z3TPmZma01WpItrSXlra2tpa8tNvdRw1SpihME2em9Qj2fzt5dMTAnF06PNFHiQGPBYQ5Q08LkH9a8dzs8iSfgpQiPoJiCHq527f5DW1Tz%2BS%2FUOW5qmbRs13Ln%2FsARCCWY4JNBuK9Nz8D8UyFCDB5oH22vCBYQHz0KOYzcOG2nSgy1FbF3rNhn0jjSGwI0IFVBKUgyTHJpLuPJA9%2FLegyD7F9dm202xIeB1hAvKrV5DnB9QniDwJwWPowSQPc%2FDop%2BWjeyYGM3NhEhfmNLHBrN1mg7%2BRFNMEFTHMTJiVoQstQ%2F0CdsFKc1hm8LpKDIjB5DqHWQIiNfXDpPlyDW7%2Fyjd7%2BUPHJ%2BL90CcP9c3Qx%2FyLDL7F1kOvc2OEqqoeq%2FZjmvkETZIkQfYIPMZDof%2B5%2BfKp0bi5Q09JtukVTQRJmoQuiMLzNSgazIPUa%2FCRn2ZhHsS%2Fg00RFHnBfoC1%2B%2BBSTPK5SVxm%2BDLHleJPo5HMjelDnGbwc4bAAwoAzXZecS%2BoBtxCHBsXNixDeW5%2B%2Frkcua5ykYEEbdMsRl83f8jsqxjCpIRReoDeA7otELP7c4DfDdwT8S1HKfRxDvzJAOLofL6H7QuKDaICvnBra4cMilxyvSxkc2tEh2tRHvbkLOO69TwzpCDT0dGyaPf5yui989Vw34HX5odUuu%2F6q4e2betjwxutA1Fl5lbgDohpt65antESlZa%2FP0dT5kwZRe2XHLHWJzEhZJmQH0h%2Bt6yzSjvbHCcgrrTo8yAaoUUnibk6EaxEPaVT5dTr1D2JZBm0VrgIOr4M2YXJ7%2FW2JHQ1Jo1DNd9H9JHkxx12ENkazZUtVjkkG9WW9VNPSAbW9rSze7oodgXVELd2ic6EGozn5%2BmpGKayXk35rOxS7WEwY2fr7iYm%2FRlS6rIaGFp4HlG2RumMoC6zkVGV43KsC4roUGIxMfVq7bSnnNNqn3pBR8%2FX%2B4UxWE27trNS9%2B26Wpe%2BFjhM0DImylKKOKsrI3lubzpZXvDGzFvtR5tUcFCbFWvvTLjW1l%2B6pq3Fuf%2F8fA%2F9u1h%2FusR%2FAk%2F3vVixZE8CObg3xEvh2uKDnuOdURTJk0SRj04%2BXykC7ysGP%2BshaxN5KkPRGiMfVvTWZmdVJc3X40nqKEHpTvm5rApzvhpLcqiJ%2FJCnLJmvKgeMDNIdaR311Cu9oU27sV2sl1Tkto1Ajacd9czDQUXW%2BkKuNEmu9IVGabsAYNtJ2%2FGstrDuNk2Y1%2FKOnwv%2B1BZ4TRNX044baznGPV85m8pHTgLmJPm%2BPOMv%2FfNUxP8LvMqJLX8o2aPCMddnWpOONGUJBGxbq9Di1HY4LsvuUD6P07BllqAQLcIK2XToEhWtHR2akplOG0jA2%2B2RMTCFVu9MFBV9miagtXRznzbSNSNqztQ7EFpdJIay6BEWCd2VPZq5R5QsEvu0n1DztVV2BTAcqfMRqe%2F3BNcylyOD0LSVO%2Bb0hcKkVdzdDIzJlJgNgJWL5nRdB1YyY6ljsazqjrxKRytnyR8JgluLzqy1VDnPjZNjxIzr3cEZHplImR7FId9dripSLlYbC7El2EesOYglDZ7jUGcVOaS0PVvGZYfpHWjfAszxYM%2F80T4Qj7ppCKTAQznotANHI1mnNdpLm47Rtde8N1i2HVklo1XVFflK5nmgC0gShWzBjy%2F7NDI0md%2FxvCaQl5zwJH%2B%2BFARjrBxbgyMsxcRmC84vDGOLuntmsoklYXv1MzV5KQlLX1icDhpJJlIbk9itdCXTu1GnHiTnugRyehDXfz7nGMXyRJc7DJDR0ofCvgU2HoeQARRFo%2BRKrtaSbZCRgMFEf61MqjXOI2uEz0MlvvbNBH4u8T7kNZ4ciuZxaCqbtoTzTawsnmfwuZkLI7Maz8xE7AxbPa67ItQ9Y2k1NddWsXUowTLBJ0Y78a53MNC0ZyAdheOJug4X%2FGigjqSKH5CuR9BO7VbHUUF7K3pX2VtdbjltKxjJQlyqi5kwP%2FY6pw490ZlZzRFEx5%2B7waR1lg3W2eozbscfj%2BdQKVpmoTD1uH0WfHm4YaqsLXvzY5pMk30ncwKuGEeJuASpw4s%2B2zJ7HJhw3AiM%2FT3HsdFgHUhhMRcMqTOcqOP0aFC4TlG0MSVXlLURbTawBqQl6%2F4o2EynsaNYvWM2gfYE3wp7ydydvW4tKVZHcdmq7U9MkhKhq85VjsjNQ0ig9qpFbZnTYpeei%2Bw43Vk25wu1e1obVYspZQbgjKwJf%2BldK9zHonU3vpY14n3B%2B6oivokrLNG88KJo0JuBL7zwcncZ%2BE7LQvfS9aHnj5XYVxLuTZbdPT%2B0v5qD%2BC6fQ%2F9NVUPvqrFxfw7rvCGm8QFkIbro0zhMwriIm3eeX8aJEVbM%2BD5%2BedMDMPQAeoRFlh4A%2FiHUlCeitLrz%2Bo7na9%2Fv8LiRvKw6uWhs9CY3rxPdZcjHaS9OWNrcfDDz64i%2BOcNHHP5vEIdiE4XuE%2FEe6Yb7hXuOA74pcvjXeH6L15jiFPhKdqE8zfbXVwIGwq8lAviw2QjRxTfMoPfc3IIIYdPFc4AFHch%2F8PbBc12sD9vr4H6RhRf59hcYuWmR5NlJTD2ob4Uwy4N%2Fj%2BDH0IP7ThHXAwuiA37FpQkhFhk%2BcDnveRlE6NchPABxGJ0uEL8O52FYwuQXoYwL%2Fr%2Bfxd89ZlADYfR%2FxilEWLLoJcz%2Bdl43Wnc2r28PqnsrzR86buZvl%2FG3p8js%2BqNcv%2BBsw39g7T%2B9J8gNYIxJ374mpRsXJFf9EOMXPMKPdapDvHWeCDcCYYxwOynizS9IO8dX8S9GOs%2FA5X4BoffvE4c3cj%2FgfAjSBP5zKfK75xTdNeIXGXg3vf8y%2FPLpvw%3D%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