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="_0f360b3a-c6c9-4073-b0ee-431edad9a717" Version="2.0" IssueInstant="2025-04-03T10:18:02Z" 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="#_0f360b3a-c6c9-4073-b0ee-431edad9a717"><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>BO3UI3eBanPI8VItkLWA5C26ZeByffekZjTiCC2jvXw=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>SZESVUyaGDeJKimVeMe6gHm8Thbe57Si4U6TCXInMtBlKIS9eg9lcvknHM/+Qok1oWIf4B1vv4z5rtHC8wdXNfXsDOLG0LUE1AwwNX5pZhYFUK/K0jfsqT4jlAzi1ZsUQcK7GSQWJyg9fJp++MBcAd2+qGx+ZNBsxUoywXszYxcS3HFGBGabCqvoBJZcaYe/6H0CrktK2N0vNCJqLELyoJWQy5Faj+MLKqF8cgMWD/cmy5RFD/rC/t5k47vcY0Y3wI6LHmjl6fb1PvR8QRgnYzWICKuZ7cMgElp/6ieBFiXbN4DzbCtJYJNHTEVATpn5gPsGqWVFwrbIzqQPO8QFvQ==</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=1VjZkuK4En3vryDoR6LKNngBoqsmvIENNouNWfxyQ9jCCLxgywvw9VdQBV1dvcz0nZno20%2BgTOXRUSolHfnTH8corJUwwyiJn%2BrMI13%2F4%2FnDJwyi8NAVi3wbWzAtIM5rpF%2BMu1fHU73I4m4CMMLdGEQQd3Ova4um0W0%2B0t1DluSJl4T1NyE%2FjgAYwywnBOo1XXmq%2F4fetHh63QIPHu91HlhaaD2saQgf2BYDfeB3gMAI9dr8RppAkECMC6jHOAdxTkx0k3ug2Qe6NWPoLtPu0k23XlPIPFAM8mvUNs8PuEtReYzAI%2FJhnKMcPAZJ%2Beidqd7EntnUhXmTWhPWXr0m3kjKSYyLCGY2zErkQccyPoNdsJIclhm8zpIAEjD1mMMsBqGRBCiuP1%2BT273yzZ5%2FGPiJetv1k4%2B7NgoI%2FyKDr7n18cvYBKGqqseq9ZhkAdWkaZqiOxTp42MUfKw%2Ff6jVbuHQ1%2BNNckWTQZzEyAMhOl%2BTYsJ8m%2Fg1MQySDOXb6DvYDMXQF%2BwHePQePIaNP9apywifx7hS%2FMtoNHtj%2BhAlGfyYYfCAt6DJ8S%2B4F1QLbiDJjQdrjqU%2F1T%2F%2BtRq5znKWgRhvkizCXzb%2FlNkXOYRxCcPkAP0HfJsgYfdzgN9M3Cfqa44KCkgN%2FGQCSXY%2B3tP2GWUOwgI%2BS%2BOWo7egBOKJ3p7r%2Bd5YiJzc5F0onTYbuHd3MyTLzV25rJ6ujN4GXw33FXhpviul%2B6q%2FRNiuas%2BdE%2BgrcDBE0ZwUAx9oUXu2XUNOsBHr8DN5qcdmLoVD3e7AoBN65T7WTKoxTfZMstA3rMSUJXvmslyT25W%2FHG2WWBkbfdpwVEasqtGSO7jbVc8ZUkN6t8HpjN2F4hkxLnam3lDo29PF4BR0NoNDo2FKnug3G2n%2F2HBHEj46yala4vPq6NktrdeX%2BmAtp2UiDVwPrCDFa7Sc7fNhc0SXI3mQGqpxSgaL6YnrgV3DNIZpr%2B0F5kKhvOjEWT2FymQq5%2FasUHoretWqdN7Qol3Ib9bMpLTaUyuIV%2BeFLg8LV%2FDMQA0PFI%2Bg1EPL9YhVzms5H6wGI22mzsXZIeaCCe6ni3mvytb6OZ1Oxu1pr5w%2BPd1T%2FybXHy75H8LTfS2WHN1RQA7uDflycG3IRs%2Fhs6nriq%2FIshieArHSJTHQLXHSwc469A2WaZqselg2N3NuUlXKdDUYJq6%2BLb2ROFUNaSpWA0VFpiz2RcZRySK4QLNoTzN549Qp%2Ff686UXzYrVgQq9lbY1oxBtnEfYq%2BjieqZWpqNV4ZjLmbguI7WTuRM6cOXebKU2P6k6cSsFoLommKS9HvBeZOcE9Xznb%2BntOEuGkBIE6ES%2F%2BaSKT%2F5JoCHIj6CtzrXDt1blpKmmTcSQKtpwlcgSjhQZl2e6r50GCGnYJCtmhHMQlfY%2BqmmbqNhmV5VtAAf5uj62eLTU6Z6qomqdRDBoLLw%2BaVrJiZdMd%2BQfKPBaxpc86lENDbznXJl6K41k8P%2B2HzHTllG0J9DVjqtHj%2FZ4SGvZCsyjTXHoDYTzT2aSK2uueNRxRkx5wctkerY5bJ55wTFosqiOvLhNt6S7ElKKElexOGgtD8L0oTkN2cNwd3H7Khvoolftie7GsaLVYrh3MlWAfcnYvUkx4jtCY01XEmHuujEqe7RyagQPY9DCfBNp%2BK6dj25JoSYTqlm9tXZPm3Ia2V9a81Z6vRL%2B3aLmqQYfLqi2LlSqKYCxhRZaymTi4rJNmmaq4E0VToi814SvBdCFJ1kBPG70UlnI85wohKCxrg9t7driOFGlzjbNNdaFIi0CanQ4mTcdKi5DYLcd6Nm6H%2FLEXn48lUJODvPr5mmN1x5c94dDDVmPcl%2FYNsPYFjC2g6yajVmq1UuYWHUoETA5W%2BrBakTpyNLIfKvnFN5HEqSIGUDRFui%2Fbad%2FW1y2F1JtcOaLIkn0zlTS7GkzsWOb7jY7QXlLGnnXMIzM1l5FzKMEiJjvGPImef7DwqGPhMUaDobFCM1HrGZpSiT3a86mme%2FSqVCua%2FrK5q%2BabsdpwW85WU6WoNGYTaZp2%2BBPfHI7ZyVGgKD6Yetth46xanLsZT4SdmKZnpBcNu9DZ46B1lgK1v2arrKX60zSJR%2FGez9ytUAzCWF6AxBXlgGvYHQEMBUEDg2AvCFzYW20VVEwlS%2BH7Q2OQpBazKgOmaY3oJeOs5Tm3dXq0o44DbbsejSJXdzppNoTzIbkV9oq9O%2Fvto6I7vO5xVSsY2jQjQ8%2BYGgKV2wdE4daywWzY02yXnIssHe2cuRBIR%2B%2B0sqoGW6osIBV5pIKFfz3h3h9ad%2BPLsUa9PfC%2BOBFfxRWRaD66KBr8ahALH13uLovcaRnyLq53nh8rsS8k3Kssu0e%2Ba38xBvVNPofuq6qG%2FlVjE38Oj3lNTqIDyBC%2B6NMIxSgqovqd5%2Bd%2BckgUM7mPn1%2F1AEQ%2BwI%2BwyJIDID%2BUkYhUmFR3Xt%2BIfPF9h8eN5GXW8UVj41e5eR3oLkPeD3sJItLmFkOYX3t07QnZ4vB%2FgzgU6xB5n6i3SDfcz9xzkvB1kcO%2Fx%2FNrvNqIlMAXsgvnSba%2FvhIIEHktUSCA9RrCl1iUQf%2BpvgEhJqZLZI8IOpD%2FyduHjHWxPmyunbtFhi7y7W8w8pIizrOTnPhwvJFQlm9%2FHcH3qQf3laKuGxaEB%2FKKS2JKLjKy4XLR9zOI8e9DuAciFJ4uEL8P5z4qYfybUCYH%2Fq%2Bv4m9uM2gCFP6fcUKYSJZxCbN%2FnNeN1p3Ny9uDad%2BO5neOm%2FnrafzjJTK5%2FujXLzgb9C%2FM%2FS%2BvCfa2MCKkb1%2BTkrUH4qt%2BiMgLHpPHOsNTr84T5YUARZi04yJa%2F4a0c3IV%2F2ak8wxc7heA%2FF9PHN7I%2FQnnwzaJ4b9XIt%2Fdp%2FiuET%2FLwLvp7Zfh5w%2F%2FBQ%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