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="_6273f6aa-7e80-4d17-9950-1fdefc02b08b" Version="2.0" IssueInstant="2025-05-20T03:42:05Z" 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="#_6273f6aa-7e80-4d17-9950-1fdefc02b08b"><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>qhEEd4kh4SvFhSasFA6SlYxH+c0kgsjZEpiwU4ufYgY=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>TqsflGkgFwA5wRGiw3AQMOmpzJOtgVomCH3XDLWx6ODR4KATKCwN/mwIqqIgno2VLM/05lnPoRVpiXrQ8DT4d3EOGhf4btTQvBm7DtTqZG9E5LV8TkVxz0Ui56Lr3ns1xmrgID7nuz3GjDX54BpWw1UDvwWWvI6EbB1e4yg1rBpv0z9Z6eEHKgqXLc6a/jrg9PgfQEKpxPCMvLGodh//GWy9J8aftN5B1TG7bOst3LNWR95btC7MrpD8qtTwzM/LKH8pTfGfyTsWpwuyuaeH5IYpAOIZKF2hKMRPFI3ce80V5j5jFz5iqYOT3jx6NzISsAogB0JtJDmMBqN5qh8N7Q==</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=1VjZkuK4En3vryDoR6LKC16A6KoJb4DBZrEx28sNYQvb4F3e4OuvoAq6unqZ6Tsz0befQJnKo6NUSjrypz%2FqMGiUMEN%2BHD01qUey%2Bcfzh08IhEHSE4rciwyYFhDlDdwvQr2r46lZZFEvBshHvQiEEPVyu2cKutajH8leksV5bMdB803IjyMAQjDLMYFmQ5Wfmv%2FhaL695wB44GGHfGAcin%2Fodlnygdo7cG%2BT9I7s7JqN5Y00hsCBCBVQjVAOohybSJp9INkHmlyQ7R5D90h222zIeB5%2BBPJrlJfnCeoRRB754NF3YJT7OXh04%2FLRPhP9mbkwiQtzmthh1nazIdxISnGEihBmJsxK34aWoX0Gu2DFOSwzeJ0lBsRgSp3DLAKBFrt%2B1Hy%2BJrd35Zs9%2FzDwE%2FG26ycH9UzfxfyLDL7m1kEvY2OEqqoeq%2FZjnLkETZIkQXYJ3MdBvvux%2Bfyh0biFQ0eN9vEVTQJRHPk2CPzzNSk6zL3YaQiBG2d%2B7oXfwaYIirxgP8DafrApJvrYJC4jfB7jSvEvo5HMjelDGGfwY4bAA%2FIAzXIvuBdUA%2B4hzo0NG5ahPjU%2F%2FrUauc5ykYEI7eMsRF82%2F5TZFzmEUQmDOIHOA7pNELP7OcBvJu4T8TVH2XdxDfxkAnF2Pt7T9hllCYICPqeeojjM0WPMsu%2BZAPUFzgw29bBlk0cXHbZK4lcWU%2Bw37ubpyuht8NVwX4GX5rtSuq%2F6S8QiRftgcHT7lcBWxsCv2sJcn4bJeTTN3WUcSsP2WtZWNTeVDWYsLMZSNSHCSk1T1Y1ieqnpBMkG0Sw2lom%2FzuYdecE4bWU68PbMLl%2FMSzHk5XyRbgddhdWWncVxWZ9Jy2c5LWtHiKrDzFVlPirO7cFBXrOMmKwqypLLarUqVU7ZiRRkTi6ViUlJnrtbDirDsZuuNZsDxCFzuzN3P1fGST2T9FIbxI5HEIPVqTvqgH0%2BYUVqMeB3U5S3tcnK6LK7XOL1LJE7ab6ozjqhjYedZLEf7E8LtEqq4lQAOGTVTSJM1e24T3tj3Zj11baNa3fJHthD%2F8z66Wa6aB9qbnJWTSTErkiO8pEc6mI6YVOvM%2BHnT0%2F31L%2FJ9YdL%2FsfwdF%2BLNUt2ZZCDe0O6HFx7vNFz%2BKyrquzIkiQEJ1eoVFFwVUOYdZG1CxyNoWidUZI1vV%2Bys6qS55vRON6qXmlPhLmiiXOhGsmKr0vCQKAsRaiqLRgapD3UOe3ULZ3BkrbDZbFZUYHdNjwtnHDaWYD9iqynC6XSZaWaLnRKP3gA2076QWD1hXW36eK8Vg7CXHQnS1HQdWk94exQzzHu%2BcrZVN9zEjEn2XWVmXDxz2MJ%2FxcFjZda7kBeDoutuTnTupzSlCUSsG2tfYvX2v6oLDsD5TyK%2FZZZgkKyCFw78cAmKlpPtzSlMFwbyMA5HJHRN8VW90wUFX2aRKC1snOXNuINI%2BnbiZMQel1EhrroEhYJ7fVyOLNTFC2i5ek4puYbq%2ByIYDDU5kNyejwSfMtcDQ1C19f2iJ8uVCauws6ub4wnxKwPrFwyJ5vas6IZS6XFqqo5ZR0P19uVkBIEv5G2s9ZK4x07jNKAGdWHZDtImUCdpNJA6KzWFakU652F2BIcA9bsh7IOz6E%2FZVXFp%2FQjW4Ylx3QT2rUAkybLmTs8elI6NQ2RFAWoeFzb2%2Br4pmwNj%2FKOMzrLjeD0V%2B2topHBuupIQqUIApiKSJbEbCGMLus0NHRFOAiCLpKXmnBkd74SRWOkpq1%2BCkspWrIF7xaGsUedIzPehbK4v8aZurKSxZUrLk6JTpKR3MYkDuupmk07AVf3o3NdAiVOpM3P1xyjWo5k80kfGa3pQDy2wM7hETKAquqUUinVRl4aZCBiMMndqONqg%2BvIGuL9UEkvvpkozGXBhYIukAPJTAemumvLuN6kyhIEBu%2BbuTg0q9HMjCRu0OrynTWhHRlLr6m5vg6tpASrCO8Y%2FSTYTmKgSddAU%2BSPxtrGXwjDvjaUK6FP2g5Bb2u7SocF7azpQ7XcT5XWtm15Q0UMS20xE%2Bdplztx9HjKzGqeIDh3bnvj1lkx2O1%2BOuMPQpqefbVomYXK1KP2WXSVwY6psrbizNM4mkRHLtt6fDEKImkF4q0guWzL7PJgzPNDMHKPPM8G%2FY0n%2B8VcNGRuMNZGcWpQm9KlaGNCrilrJy1Zz%2BqTljJ1h95uMgm3qtVNszFcjvGtcJTNw9np1LJqcarNVm13bJKUBG1trvFEbiY%2BgdrrFrVnTotDfC6ydHKwlrwr1vZpY1QtplQYgCuyJtyVcz3h3h9ad%2BPLsUa8PfC%2BOBFfxRWWaI5%2FUTTo1SAUjn%2B5uwx8p2W%2BfXG98%2FxYiX0h4V5l2T3yXfuLMYhv8kl6r6oaOleNjf05rPOGFIcJyHx00aehH%2FlhETbvPD%2F3kwKsmPF9%2FPyqB6DvAPQIiyxOAP4htFgggri68%2FpG5IvvOzxuJC%2Bzji4aG73KzetAdxnyfthLEJY2txjM%2FNqjZ87wFof%2FG0RS7ALf%2FkS8Rbrhfuae44Tvihz%2BPZ5f4zUmuAS%2BkF0oj7Pj9ZWAgfBriQAubDZ8dIn1M%2Bg8NfcgQNh0iexjQQfyP3n74LEu1of9tXOvyPyLfPsbjOy4iPLsJMUOnO5FP8u9X0fwferBfaWI64YFQYJfcXFESEWGN1wuOE4GEfp9CPdB6AenC8Tvw3nglzD6TSjjA%2F%2FXV%2FE3txnUgR%2F8n3HyEZYs0xJm%2FzivG607m5e3B9W5Hc3vHDfz19P4x0tkdv1Rr19w9v6%2FMPe%2FvCbI9mCISd%2B%2BJsU7G0RX%2FRDiFzzCj3WKI16dJ8IOgB8i3I6KcPcb0s7xVfybkc4zcLlfgO%2F8euLwRu5POCdeHMF%2Fr0S%2Bu0%2FRXSN%2BloF309svw88f%2Fgs%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