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="_bd549a54-13b8-4906-aa1a-55abc59006ce" Version="2.0" IssueInstant="2024-11-21T06:48:29Z" 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="#_bd549a54-13b8-4906-aa1a-55abc59006ce"><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>jnfg16q1Qzcano89AAWwClZJ/rOtsBr4hfirggYVV78=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>j4dMgvtInk8Q4z4/9PlgodyDaejXEz0nXqvrC4CHylMxLRKhN8Y5sNHpMb4Qlk9vIz63rSnLg1QzUSWf6z0PKSCsXt/NGjM5B4ATJCy7M2/va+smknve4b65RO9KjxruRDmH7c+2szR9d0JTJHQzrd/20TP2fpYYeNj7FCArWC1a/O+bGQJc2E8MqM19IBWONB6rTU8xMx/gNvsDHNtMGrJaCg7YGfrIeCsNHFq15qcaFz42tfEutrZ32x3p0xOhWjEdfz42YftTvQ9wYEvdq+33s0ucAF+ZtnpbDc3ItkaYCSE777D4tDS+Z3nCCBkYI0BNxUW9Fde7mnZsu9j1mQ==</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=1VjZkuK4En3vr6igH4kqL3jBRFdNyAtgwCw2BszLDWELY%2FAuL8DXX0EVdHV1z3ZnJub2EyilPDpKpVJH%2FvLLMQofKpTjIImfG8wT3fjl5dMXDKMw7YCy2MUmykqEiwcyLsada8dzo8zjTgJxgDsxjBDuFG7HAsaowz7RnTRPisRNwsY7l9%2F2gBijvCAEGg%2B6%2Btz4z8bjOQny3CPT2rQfOYkWHiFk4CPPw43LSzQtuKjxsLiRJhDEEeMS6TEuYFwQE80Sb%2BaRZea00OHaHVZaNx5Uso4ghsXVa1cUKe5QVBEH8CnwUFwEBXzyk%2BrJPVPdqTW3qAtzltoQ1m7jAdxIKkmMywjlFsqrwEW2OfoKdsFKClTl6LpKAkjAtGOB8hiGo8QP4sbLNbidK9%2F85Tcdv1Dvh37xcMcKfMK%2FzNFbbD38OjdBqOv6qW49JblPsTRNU7REkTEeDvzPjZdPDw83d%2BTp8Ta5oikwTuLAhWFwvgbFQMUu8R5A6Cd5UOyiX8FmKIa%2BYD%2Bio%2FvoMlz8uUFdZvg6x5XiH0ajuRvTxyjJ0eccw0e8gywvvOJeUE20RSQ2LnqwTf258fmP5ch1lfMcxnib5BH%2Btvm7zL6JIYorFCYp8h7xbYGE3Z8D%2FGHgvlDfc1QDn%2BTAnwwgic7ne9i%2BoixgWKKXfbz1GSFjZmeXbHpbAmBZK%2BF6QOWTAss5t9sGue87i4XYfr4yeu98Ndx34LX5IZXuu%2F42HecZflXo8aE9484cJU3JIryTCtF%2BpZ3peJVVucIp%2FVNoHEfmcDduOzwe91Njw83Cg1TpZ6GVW%2FHIJ4Rta7kVzvR0aCl4VVDj3t7gZQ7MB8pJNFiqgk0cHcjucBuBNyfScH%2FMS1ON%2BqLbZPHZlDx6MB%2F0Z%2BfcI9GaT9lt6jhovBe7CsiXCgOpSXPTmw1cVmsbmcFIurycjGUhn9vto3Gk%2FHGF1f64MHr5ACq%2B6PS2uY4UwrabMXzmwu6ZY4utVhb5usUeWyl9nOyWe83bEruzLebVTKodrfKyZquF6dIF3ea6iNON6rb04gAdxdJEUVS5QrWa61asKPLB0Wl5fLSXUtdDYhSvcSntmWj2%2FHwP%2FbtYf7rEf4hO971Y8bSkwgLeG8qlcG3JQS%2FQi6HrqqcqCghPPqh1Gfi6CaYStjehN%2BIY1uC0dMVuF%2Fy0rtWZMxgma31XuWMw00byDNQDVQsMBfQAY2ugrtewb9Ju3xBGJ6nyegvWjRals2RCt2XuRtFYGJ0B6tYkJnOtNlStnswNxtjvILGdjD3gjbl9txny7KjtwUz2xwsZGIayGgtuZBQE93zlbOkfOcmEk%2Br72hRc%2BmeJQv7LYCQqTb%2BnLvrl2nLOrKFmLGPLFGrZq8AWR61gUFXtnnYeJEHTqmCp2JQd8EnPpWrWyNYso3FCC6rQ2x%2Bw2bXkpnSmypo9jWPYXLqFz5qJwynGeuyllHEsY1OfS5RNI3e16E%2FdDMfzeHE6DJmZY1dtGfb6o1mfnhwOlNi0ln2TMoyVOxAnc51L6qi96ZrDMTXtQrtQrLFz3NnxlGeyclkfBW2V9FfrJcgoSnSU9bS5HImeG8VZyA2O%2B3Tdy7hQH2dKD7SXq5rWytXGxnwFDyFvdSPVQOcomPC6FjDGga%2BiSuCklPVtyGXpYur3Dzslm1imTMsAaTuhtVsbNL9u9g%2FqRjDbCwd43WVrrY3ocFW3FVBrAMCJjFVFzudgcNmnvmloYA%2BAIdOXnPBUf7aUZXOgZ81uhiolXvCl6JemucXtAzfcRKq8vfpZhrZU5aUvz0%2BpQdOx2iIk9quJnk%2FaoXDsxudjBbUkVZw%2Fn3OcbnuKK6ZdbDYnPfnQhBtPxNiEum4wWq3Vjrow6VAmYIrv6MPaIXlk98l5qJXXvqkMZirwETAA3VOsrGfpm5ZK8k2pbQA4cm5mct%2BqB1MrVoReUxLbK2p04GzjyMyMVWSnFVzG5MQYJ%2BB6qYnHkoknOBgMR04wB%2F3uqK%2FWoEu7pCatj26d9UvWW7H7erGdaKQK2Lu%2BJkfVaD6VZ5kknAR2OOGmR5GiBH%2Fm7obNs2by6%2B1kKu5Blp0DvWxapc4dB62z7Gu9DVfnLc2bZUk8jg9Cvt6J5SCMlSVM1kDx%2BaYliXAoin048A%2BiyIddZ6cG5Uw2VaE3HA2SzGScymdYc0yvGHujLPid3aVtbeL3d5vxOFrrtpTlQ7QYklvhoFr7s9c%2Bqrot6C5ft%2FyhRTMKckezkUgVVhpQuLVqMlvuNN8n5zLPxnt7Ifry0T05Zt3kKo2DJCNJrV161wr3sWjdja9ljXpf8L6piG%2Fiikg0L7goGvxmAKUXXO4uk9xpeeBeuj70%2FLYS%2B0bCvcmyu%2BeH9jdzUD%2Fkk3beVDXyrhqb9BfoWDwoSZTCPMAXfRoFcRCVUePO8%2Bs4JSSKmdzHL296AAUexE%2BozJMUkh9qlAAqTOo7rx94vvb9Co8bycuq44vGxm9y8zrRXYZ8nPbiRKTNzYcwv47oWFNyxNH%2FBpGWmzBwv1DvkW64X7kXJOCbskB%2Fjef3eA9jkgLfyC5cJPnh%2BkogQOS1REGfPEUCfPENcuQ9N7YwxMR08ewSQQeL33n7kLku1sftdXCnzIOLfPsLjNykjIv8pCQemmzlIC92%2Fx7Bj6GH952irgcWhil5xSUxpZQ5OXAF8LwcYfzzEO7CKAhPF4ifh3MvqFD8k1AmBf%2Ffz%2BIfHjNkwCD8P%2BMUYCJZJhXK%2F3ZeN1p3Nq9vD6Z9K80fOm7m75fxt6fI9PqjX7%2FgbIN%2FYO1%2FeE%2Bwu0MRIX37mpRsyGP7qh8i8oLH5PnJCNRb54lyQxhEmLTjMtr8hLQLchX%2FZKSLHF7uFxh4%2Fz5xdCP3O5zTXRKjfy5FfvWc4rtG%2FCoD76b3X4ZfPv0X"
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