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="_a746fd52-084b-42b4-8221-7377307136e9" Version="2.0" IssueInstant="2025-09-09T04:55:11Z" 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="#_a746fd52-084b-42b4-8221-7377307136e9"><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>WTmbMblp6pDVkE+Lp4EMv7vquoys6qyZWWK7zY4QdMQ=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>F0BQbCXpYrf0CA3Q4nxXCGr8pEw8CCfehNhci5nPVHKTQNw8oRm635+T/hZhhMBl+z/VeU27asi/CFEetT/5f15M3TPjt536rQRlBy9L2vOKCQvZ10YBlxY3jQj4TFrH9VbPrkvXBnkSMcC1l2gCWs7x/aw/c8v6CLGkV0hWqKjSCQyPFaqTCBdRDG1/NMA9v8Jn7W5wvet2QgQE3N4Fwz+AdppmGF834N+Qyt/00gA26r2sAxQhGHW8iSOsiykoF70Be1tgJlkD+UEKIQaCh2Os68JggWqi5TQS00iOcegYJL5pXraZH+ix+70aCjuOCtTjxbWtHGTUhgP+eJX13w==</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=1VjZkuK4En3vryDoR0eVF7wA0VUT3gADBmxjtpcbwha2wbu8AF9%2FBVXQ1dXLTN%2BZib4dURGUUsqjo1SmdORPfxyjsFHBHAVJ%2FNSkH6nmH88fPiEQhWlXLAs%2FNmFWQlQ08LgYda8dT80yj7sJQAHqxiCCqFs4XUvUx13mkeqmeVIkThI237j82AMgBPMCE2g2NOWp%2BR8gsPzO5ZgHqs1uH1hmyz60GYZ%2BEFqC0KIEusXDTrOxuJHGENgRoRJqMSpAXGATxXAPVAf%2FzSm2y3Fdmt40GwpeRxCD4urlF0WKuiRZxAF4DFwYF0EBHr2kenTOZG9mzS3ywpwht5i102yIN5JyEqMygrkF8ypwoG2OP4NdsJICVjm8rhIDYjD1WMA8BuE48YK4%2BXwNbvfKN3%2F%2BoeMn8u3QTy7qWoGH%2BZc5fI2ti17mxgh1XT%2FWrcck90iGoiiS6pB4jIsC72Pz%2BUOjcXOHrhbvkiuaDOIkDhwQBudrUHRY%2BInbEEMvyYPCj76DTZM0dcF%2BgEfnwaHZ%2BGOTvMzweY4rxb%2BMRrE3pg9RksOPOQIPyAcMx7%2FgXlBNuIM4Ng5s2Kb21Pz413Lkusp5DmK0S%2FIIfdn8U2ZfxBDGFQyTFLoP6LZAzO7nAL8ZuE%2Fk1xyVwMM58JMBxNH5eA%2FbZ5QFCEv4vJxHW30bpnyqLA4qMU5ZVa%2BEKiuTE%2BKz02a5HAnnNWu4uvF0ZfTW%2BWq478BL810q3Xf9xaNHScZWXqXrfEfJYstg4%2BNK7uftVK3bsryD%2FsR3Ai6eLQajuTGp24kZ8S2OmJP%2Bxvd1KSTO5ALajIBLj5R7KizmJLejOb01n%2B0LrsXnhhlKp86YqaYj2ag2NLWWwuO6tTf27LyXDzqL7Sw%2FVCspPli6I9Mh48lLJBxJUJNOu%2BLlcf%2BwoPxlNtpbsnGa9UA2lyXXVPo0OdHFTtUexsKSqytYMIZnqK0J26vPhOimadTvtVvshDBOBUlRnsjwOYPEo%2BH3B8t2YE1RcDokPYGSIF14w%2FCgELY60gwg%2B8wU8e2h5y2zgJsbFkUFUwd66%2BGYS1c52AyI4EgIFJD35VQu5vvjdlkM%2BnPb92YEHK7oVv30dA%2F9m1h%2FuMR%2FBE%2F3vVhxVEcBBbg35MvBtcOFXsBnXdMUV5FlMTx5Yq1JoqeZ4qyD7G3ojlma0Vk1XTG7BTera8VYD0fJRvMrZyIa6lgyxHqoqIEui32RtlWxrjdgYFLOQOfHp07l9heMEy3K9ZIOnZbpj6MJPz6LsFdTx%2BlcrXVFradzndb3PsC2k74XOX1u3226ZBzVvWhI3mQhibourya8E%2BkFxj1fOVvae04S5qR4njoTL%2F1GIuP%2FJXEsyITXVxaDcmOtz4yuZAxtSyRs2avAFsatYFhV7b56HiYBYVWglG3SDrik75A1o2cbhlZZvgUU4O4PyOxZEtE5k2XNnCYxIJZO4TFmsmZlfTNxU1I%2FlrGpzTukTUFntRjMnAzF83hxOoxoY21XbQn0B2NjQE0PB1IgrOXAJHV95QyF6Vxjkzpqb3vmaELiHLQL2Zqsj74dzzg6K5f1kVdXyWC1WYoZSQpreTMjlmPBdaI4C9nhcZ9u%2BhkbapNM7ovt5aqm1HK1tRFXgUPIWb1I0eE5Cqacpga0fuCqqOLZTsp4NmCzdDHzBgdfzqaWKVGSCFWfb%2FkbneI2xOCgbHmzvViLbm%2FZ2qhjKlzhwhVrVRTBVEKKLOVzcXjZp4Gpq%2BJeFHWJuuSEq3jGUpLMoZYRvQxWcrzgSsErTXOH2gd2tI0UaXf1s3R1qUhLT5qfUp2iYqWFSexXUy2ftkP%2B2IvPxwqoSSqvfz7nWM12ZUdIe8gkpn3pQICtKyBkAk3TabVW67WyMKlQwmCyt9ZG9RrnkT3A9VDLL30zSTQU0YOiLlJ92cr6lrZtKTjf5NoWRRbXjSENrHo4s2KZ7xMdob0ixwfW1o%2B0oa8iO63AMsYVo59Ex01NNOmYCB8Nw9F4HczFQW88UGqxRzkuyWyOTp0NSsZdMft6sZuqxKZl%2BwNViqrxfCYZWYc%2F8cxoys6OAknynuH4I%2BKsmtxmN50JezHLzoFWElapscdh6yx5an%2FL1nlLdY0siSfxgc83vlAOw1hegmQjyh5HWB0BjARhAIbeQRC4sLf2laA0JFPh%2B6PxMMlMel15NGNOqBVtb%2BUF59s9ylan3sDfTibRRrM7WT6CixG%2BFQ6KtT%2B77aOi2bzmcHXLG1kULUNnbIwFsrDSgEStFUHv2NN8n5zLPJvs7YXgSUfntDZrgq1UFuCMPJLe0r2ecO8Prbvx5Vgj3x54X5yIr%2BIKSzQ3uCga9GoQSze43F0mvtPywLl0vev5sRL7QsK9yrK757v2F3OQ3%2BSTdl9VNXSvGhv3F%2FBYNOQkSkEeoIs%2BjYI4iMqoeef5eZwcYsWM7%2BPnVz0AAxegR1jmSQrwDzlORDJM6juvb3i%2B9H2Hx43kZdXxRWOjV7l5neguQ95Pe3HC0ubmg5lfR3StGS5x%2BL9BpOU2DJxP5FukG%2B5n7gUO%2BLYs4N%2Fj%2BTVeY4JT4AvZhYokP1xfCRgIv5ZI4MFmI0AX3yCH7lNzB0KETRfPHhZ0oPiTtw%2Be62J92F0Hd8s8uMi3v8HIScq4yE9y4sLpTgrywv91BN%2BHHtx3irwWLAhT%2FIpLYlIuc1xwhei6OUTo9yHcA1EQni4Qvw%2FnflDB%2BDehjA%2F8X5%2FF3ywzqIMg%2FD%2FjFCAsWaYVzP9xXjdadzYvbw%2B6fTua33XczF8v4x9Pkdn1R7t%2BwdkF%2F8La%2F%2FKeIMeHESZ9%2B5qUbB0QX%2FVDhF%2FwCD%2FWaZ587TyRTgiCCOF2XEbb35B2ga%2Fi34x0kYPL%2FQIC99cThzdyf8I59ZMY%2Fnsp8t06RXeN%2BFkG3k1vvww%2Ff%2Fgv"
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