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="_745535b9-6992-4de6-a799-94b936783891" Version="2.0" IssueInstant="2026-04-20T08:20:19Z" 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="#_745535b9-6992-4de6-a799-94b936783891"><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>2ET7glegrZnOcdiCI7rBFvUhQtXSGF/TWvB+9bKwhVY=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>gCliYA9eX0LnBJ9SaC/0/t7PPdzMCFPuJKA21YTFjh/dag/rWTLrT+wjrsIEofKM2to21Uku9/u/7WYtlWn25XvoWfDTvG1UvyCDoPO/bqegqaEjIL8aoyfai2RpyquPNuDzA9o7kacmGkCUdb47HaRW3exXRsV7a0JLjXIKl+PvH7RSD38MXLBrvhDKNlbSl8TAd2s24nSYA20aTxN5IxlRpY073Nf642BcpBLmbYN+ByoaV9zHTSYPUOWJrXZy3fW4fLHjySPapZt84iQcc9gOD3DJs1CO/y/seQHpNnaxk1lVHEUCWIa/+md9fm/uRKKcgoW3XIinNCmbP3D12g==</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=1VjZkuK4En3vryDoR6JKtjEYE1014Q0w2Cw2BsPLDWELY%2FAuL8DXX0EVdHX1MtN3ZqJvP4FSyqOjVKZ05E9%2FHMOgVqIM%2B3H0VKcfqfofzx8%2BYRgGSVco8l1koLRAOK%2BRcRHuXjue6kUWdWOIfdyNYIhwN3e6pqBrXeaR6iZZnMdOHNTfuPzYA2KMspwQqNdU%2Ban%2BH45ttZqtDf%2FQ5nnmgXVR%2BwFyPP%2FAsxu%2B2eY6zQ5P12uLG2kCQRwxLpAa4RxGOTFRTPuBYh8Yak51ugzVpfl1vSaTdfgRzK9euzxPcBeAPPLho%2B%2BiKPdz%2BOjF5aNzBr2pOTfBhTkDNoS1U68JN5JSHOEiRJmJstJ3kGVon8EuWHGOygxdV0kACZhyzFEWwUCLPT%2BqP1%2BD273yzZ5%2F6PgJvB36ycVd0%2FcI%2FyJDr7F18cvcBKGqqseq%2BRhnHmAoigIUD8gYF%2Fvex%2Frzh1rt5o5cNdrGVzQJRnHkOzDwz9eg6CjfxW5NCLw48%2FNd%2BB1sGtDUBfsBHZ0Hh2ajj3VwmeHzHFeKfxmNYm9MH8I4Qx8zDB%2FwDjKt9gvuBdVAW0Ri46CaZahP9Y9%2FLUeuq5xnMMLbOAvxl80%2FZfZFDFFUoiBOkPuAbwsk7H4O8JuB%2BwS%2B5ij7HsmBnwwgic7He9g%2BoyxgUKBnRplzXoC8bB1NHNeXVC4Te6W1m%2BW22e%2BB%2BbIUG%2FxmVO0Wq6cro7fOV8N9B16a71LpvusvHp4U%2BCuBRzalReKQN6EEKJBz06l71qXetBiOBIZezXv7HXChB7LlXMvmjWqfYVWJtyOdyWOGtg4FDwrALVd5sIyYll3Gy608L%2Fu0VZ4kOZ5OwCZFXgqVvap1YHzaQp8xklNaTMeFfBb4mDtAJ%2BwfJMvdsNwAGssmOtoGXnCQGmp7Wx0FjWk54AxTbnZ0WxOzciePxsHGDDpzwWUww0bmSmAoOD%2BOW%2BoxMJIVxTXH2zbLiE4iauFmNW6Ipxgu%2BPNgbq6m1mQ5zOz1qbldslttsD%2BZU5is8w7rzxyH9yZyUx5iWpqAE8BoNkjGETwe6GAxUCxpqULQCF1%2BG4LCGI0cL142bdWPxlK4mTZlmvGenu6hfxPrD5f4j9Dpvhd2i%2BJlmMN7Q7ocXFtS6Dl61lVVdmVJEoKTJ1SqKHiqIUx5bG0CV2NpRmeVxGa2i9a0quTZajiK1%2BqudMbCTNHEmVANZcXXJaEv0JYiVNUaDgzKGeht7cSXbn%2FBOOGiWC3pwGkaOy0ct7WzgHoVdZzMlUqXlWoy12l9v4PEdtL3QkufW3ebLs6Oyl6Yid54IQq6LtnjthPqOcE9Xzmb6ntOIuEke54yFS79s1gi%2F0VB46SG15cXg2Jtrs6MLqckm0SAmpbtW5zW9Idl2ekr52HsN8wSFpIFLL8V9x1QMXq6ZmiFbTehDN39ARs9k5TGGRQVcyLb1Vg6uccY8YqV9PXYTYB%2BLCJDnfPAopBjLwZTJ8XRPFqcDiN6trLKjgj7A202oCaHA%2BAa5nJgAF23nSE3matsXIWdTc8YjcG0B61cMser486Kpi06LZbVsa3Y8cBeL4UUAG4lraeNpca5ThilATs87pN1P2UDdZxKfaGztCtKKeyNhVslPAQtsxfKOjqH%2FqSlKj6tH1plWLZZPmE8C7Jpsph6g8NOSiemIVKigJRdu7lb61Rr3Rgc5E3b6CxWgttbNteKRgV21ZGEShEEOBGxLInZXBhe9mlg6IqwFwRdpC454crebCmKxlBNG70UlVK0aBWcVxjGFncO7GgTyuL26mfqylIWl544PyU6RUVyk5DY2xM1m3SC9rEXnY8lVOJEWv18zrGq5UoOl%2FSw0Zj0xUMDblwOYwOqqk4rlVKt5IVBBSIBk7yVOqpWJI%2BsAamHSnrpm4rCTBY8JOgC1ZfMtG%2Bqm6ZM8k2qLEFgSd3MxIFZDadmJLX7DZ7r2EA7sJZ%2BpGe6HVpJCZcRqRj9JDhuYuAxb%2BAJ9ocjbeXPhUFPG8iV0KMcFzDro1Olg4JxbWZfLbYTpbFuWruBIoalNp%2BKs5Rvn9rMaMJOjxwAbW%2Fm7EaNs2K01tvJlNsLaXr21aJhFip7HDbPoqf0N2yVNRV3lsbRODq0s%2FWOK4ZBJC1hvBYkr9UweQ6OOHIkDr0Dx7WC3mon%2B8VMNOR2f6QN49SgV6VHM8aYsmlrIy1aO6tHWcrEG%2Bw243G4Vi0%2BzUZoMSK3wkE292e3c5RVq606rarpjUyKlpCjzTQO5GbiA9y0G%2FSWPc338bnI0vHeWnCeeHROK6NqsKXCQpKRR%2BAt3esJ9%2F7QuhtfjjXw9sD74kR8FVdEorn%2BRdHgV4NQuP7l7jLInZb5zqXrXc%2BPldgXEu5Vlt0937W%2FmAN8k0%2FSfVXVyL1qbNKfo2Nek%2BIwgZmPL%2Fo09CM%2FLML6nefncVJAFDO5j59f9QDyXYgfUZHFCSQ%2FQIsFEMTVndc3PF%2F6vsPjRvKy6uiisfGr3LxOdJch76e9OBFpc%2FMhzK8juuaUlDj63yCSYhP4zifwFumG%2B5l7TgK%2BKXL093h%2BjVcbkxT4QnbhPM4O11cCASKvJQA9VK%2F5%2BOLrZ8h9qm9hgInp4tkjgg7mf%2FL2IXNdrA%2Fb6%2BBukfkX%2BfY3GDlxEeXZSYpdNNmKfpbvfh3B96GH950C14KFQUJecXEEpCIjBZcLrpshjH8fwj0Y%2BsHpAvH7cO77JYp%2BE8rkwP%2F1WfzNMkM69IP%2FM04%2BJpJlUqLsH%2Bd1o3Vn8%2FL2oDu3o%2Fldx8389TL%2B8RSZXn%2FU6xecrf8vrP0v7wl2digkpG9fk%2BKNA6OrfgjJCx6TxzrdBq%2BdJ%2BAE0A8xaUdFuPkNaefkKv7NSOcZvNwv0Hd%2FPXF0I%2FcnnJNdHKF%2FL0W%2BW6f4rhE%2Fy8C76e2X4ecP%2FwU%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