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="_a4c05f7c-633c-4b3d-88db-8439076ff08f" Version="2.0" IssueInstant="2025-10-22T07:00: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="#_a4c05f7c-633c-4b3d-88db-8439076ff08f"><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>MMXOVwOUrwxohtsnf/l1rYZPs623BjB4YC2YlSlUDL8=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>YWAD1KDb+1AcOEEhQ/jqt0wEfOz1COlBZl66/MW7kjZBYjoBnsVNDmvDSU1suxA5DhSf2CwIFOF67P8Bwl6tXBqy2jheB0GuCddPpJEdqXu/WrtBKAqGhk2dXVBbbIdMnc3KZXGekVcdRQMn0meUE+Y2qhCiWm0JUwWAobhd8qIlSuaBwpZsBLNsyyC7GSoKXnmz04eTRqwe4eR3rdgM2niFlb9n0ZPHoyx59Rkav8uE5tkBFVaxOV2DUcayNttlnYWg0F0yNL3+Tv4j4+FSZQIf0PU2MeNCfhA61zh+utJ4sW57Ay+182QDt3d1QYpQFv8Q/VBFok5hbU7NMz2CTA==</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=1VjZkuK4En3vryDoR6LKC16AqKoJeQEMmMXGLH65IWxhG7xgywvw9VdQBV1d3TPdc2cm5vYTKKU8OkplSkd%2B%2Bu0YhbUSZThI4uc680jXf3v59IRhFB46oMj92EBpgXBeI%2BNi3Ll2PNeLLO4kEAe4E8MI4U7udEygjzrsI905ZEmeOElYf%2Bfyxx4QY5TlhEC9pinP9f9AzqH5reg8CM2m88Btmu5Dq%2BVuHlpcs02LwnZLt7b12uJGmkAQR4wLpMU4h3FOTDTLPzD0A8vOabFD0x2%2BaddrCllHEMP86uXn%2BQF3KCqPA%2FgYuCjOgxw%2Bekn56Jyp7tScm9SFOUttCGunXgM3knIS4yJCmYmyMnCQZYy%2BgF2wkhyVGbqukgASMPWYoyyG4Sjxgrj%2Bcg1u58o3e%2FlDxyfq%2FdAnF3fMwCP8iwy9xdbFr3MThKqqHqvmY5J5FEvTNEW3KTLGxYH3uf7yqVa7uSNXi7fJFU2GcRIHDgyD8zUoOsr9xK2B0EuyIPej38FmKIa%2BYD%2Bgo%2FPgMFz8uU5dZvgyx5XiT6PR3I3pQ5Rk6HOG4QP2IcsLr7gXVANtEYmNg2qWoT3XP%2F9cjlxXOc9gjLdJFuGvmz9k9lUMUVyiMDkg9wHfFkjY%2FTnA7wbuifqWoxJ4JAf%2BZABJdD7fw%2FYFZQHDAr3o%2BmqyqCZWVh0TP8fxlgqZbG1PscA2pZ3ErWV2HZqhpYxaz1dG752vhvsOvDY%2FpNJ911891kugMENl02CAM1FVf0bt0pyu1O3kzMiTULJDQaD0pbjf2dJ6l0gxXoyVqFRMi8HFEfCKb25ZudK6k64gTltSFQr5SkpP7M5HEt0rZNedHgaqm64Kapnl0hCkPX%2FPuquFtNlorh47zaG96qH9wnGNmR7TEbLUxppNfTlYRvTAqpYg2fhuK9VCs4BSdbCxNBrj00kWe2YyXMXRmebQ3EgrxCGjmbmezsZBN9y0Y9qe9pPTkW8be1i2CpXP91J3AY%2BTBatYDjyN8zyM10uP7tKn8ajZmJfcjmt0TXumbempxepoLG99IDBnv1HkAw4veRGcGkyLnSl502Vm68OsW7Zm1ELqJnve31jiWD%2Bz8hw8P99D%2Fy7Wny7xH6LTfS9WPN1WYA7vDflycG1JoeckETRNcRVZBuHJA5UmAU8zwLSNrU3ojjiG1Tn1sGK3C35aVcpsPRgmtuaXzhjM1JE0A9VAUQNdBj3AWCqoKhv2Ddrp68Lo1C7d3oJ1okWxXjKh0zT8UTQWRmeAuhV9nMzVSlfUajLXGX3nQ2I76TvA63PrbtOl2VHdgZnkjRcS0HV5NRacSM8J7vnK2dQ%2BcpIIJ8Xz1Cm49M8SmfyXwEiUG15PWfQL21yfWV1JWcaSKNS0VoEljprBoCxbPfU8SIKGWcJCtigr4JOeQ1Wsntoso3JCEyrQ3e2x0TWlRvtMFRV7GsewsXRyjzWSNSfr9tg9UPqxiA1t3qYsGjmrRX%2FqpDiex4vTfki20ipbEuz1R7M%2BPdnvKbFhLvsGRarRGYiTucYlVdTadI3hmJp2oZXL5nh99K14yjNpsayOgrpK%2Bit7CVKKEteyPW0sR6LrRHEacoPj7mD3Ui7UxqncA63lqqLVYrWxMF%2FCfcib3UjR0TkKJrymBoy%2B58uoFLj2gfUsyKWHxdTr7305nZiGREsAqb7Q9G2d5u1Gf69sBKO1WAO3u2za6ogOV1VLBpUKAJxIWJGlbA4Gl33qG7oKdgDopCxJTriKN1tKkjHQ0kY3RaUcL%2FhC9ArD2OLWnhtuIkXaXv1MXV0q0tKT5qeDTtOx0iQkdquJlk1aoXDsxudjCdXkIK%2F%2FfM5xmuXKjnjoYqMx6Un7Bty4IsYG1DSdUSu1WisLgw4lAiZ7a21YrUkeWX1SD5X82jeVwEwBHgI6oHuymfZMbdNUSL7JlQUAR%2BpmJvXNajA1Y1noNdpia0WN9pylH5mZvoqsQwmXMakY%2FQQc92DgcdvAExwMhqN1MAf97qivVKBLOy7F2kenSvsFObzYXbXYTtSG3bT8vipF5Wg%2BlWZpWzgJ7HDCTY8iRQnezPGHjbNq8PZ2MhV3IE3PgVY0zELjjoPmWfLU3oarsqbqztIkHsd7IbN9sRiEsbyEiQ1kj2%2BYbREORbEPB95eFPmwu%2FaVoJhJhiL0hqNBkhrMuvQY1hjTK8bayAvet7q0pU68vr8ZjyNbs9ppNkSLIbkV9oq5O7uto6JZgubwVdMbmjQjI2c0G4lUbh4CCjdXDWbLnea75Fxk6XhnLURPOjqntVE1uFLlIMnII%2BUt3esJ9%2FHQuhtfjzXq%2FYH31Yn4Jq6IRHODi6LBbwZQuMHl7jLInZYFzqXrQ88fK7GvJNybLLt7fmh%2FNQf1XT6HzpuqRu5VY5P%2BHB3zmpxEB5gF%2BKJPoyAOoiKq33l%2BGSeHRDGT%2B%2FjlTQ%2BgwIX4ERVZcoDkhxolgAqT6s7rO56vfb%2FD40bysur4orHxm9y8TnSXIR%2BnvTgRaXPzIcyvIzrmlJQ4%2Bt8gDsUmDJwn6j3SDfcL95wEfFPk6K%2Fx%2FBavNiYp8JXswnmS7a%2BvBAJEXksU9FC9FuCLb5Ah97m%2BhSEmpotnlwg6mP%2Fg7UPmulgfttfBnSILLvLtLzBykiLOs5OcuGiylYIs9%2F89gh9DD%2B87RV0LFoYH8opLYkouMlJwOXDdDGH86xDuwigITxeIX4dzLyhR%2FItQJgf%2Bv5%2FF3y0zpMMg%2FD%2FjFGAiWSYlyv52Xjdadzavbw%2BmdTuaP3TczN8u429Pken1R7t%2BwdkG%2F8Daf3pPsOOjiJC%2BfU1KNg6Mr%2FohIi94TB7rjEC9dZ4oJ4RBhEk7LqLNL0g7J1fxL0Y6z%2BDlfoGB%2B%2B8TRzdyP%2BB88JMY%2FXMp8rt1iu8a8YsMvJvefxl%2B%2BfRf"
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