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="_3a12c17a-2556-48a6-851e-7fbdef0f7b8b" Version="2.0" IssueInstant="2023-03-22T07:27:06Z" Destination="https://tnia.identitaobcana.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="#_3a12c17a-2556-48a6-851e-7fbdef0f7b8b"><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>EgjaXtRqGJAhF/DKmMvW+oDiN+b0xvjjpJ6PGTsNOS4=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>sZi3sBoUESLiPbUrPoaoWI7o/rm3KwicSk8l72kMdZuLI6K9LZC31cMZwfaQVwXWN+sIKeCpoNZ7qakLj9g8N0v0t0fQp0FJT7dZEY29vM65l9/9ga4DvxwfwbwATK4Py4/ScYm2ocE4+Lci4LK6bog+6WgTcKPRL3qW8JjXvn7Z3O/yJoJ6R3BmokHAOeIEEOtUMxbd6qFZLDFv1OM/UGTeErSdtoC+JgFl67WTDSuRpCuf7Pz+/vd4ILdANmnZCtciHE+rZJ52iuwFzB5KVowXpys1tyrYXO1GA2epMsFIxHKCoPJ6hwn8Ae1ibNz3Ul/PjutUebH+uZa0kBNOvw==</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.identitaobcana.cz/FPSTS/saml2/basic?SAMLRequest=1VjZkuK4En3vryDoR0eVF4wNRFdNeAMMNouNWfxyQ9jCCLzLC%2FD1V1BVdHV1z3ZnJub2EyilPDpKpVJH%2FvLLKQobFcwxSuKnJvvINH95%2FvQFgyhMe1JZ7GMLZiXERYOMi3Hv1vHULPO4lwCMcC8GEcS9wuvZkmn0uEeml%2BZJkXhJ2Hzn8tseAGOYF4RAs6GrT83%2FtADLeawIHrh2W3jgO0B46LRZ%2BCDutj7cMTtx29k2G8s30gSCOGJcQj3GBYgLYmK41gPTeuC4BSP2OLHHCG6zoZJ1oBgUN699UaS4R9NFjMAj8mFcoAIkWw%2FE4NG70P2ZvbDpK3eO3hLeXrMhvdFUkhiXEcxtmFfIg45lfIW7oiUFrHJ4W2dxA9NOBcxjEBpJgOLm8y28vRvj%2FPk3Hb%2FQ74d%2B8XHPRgFZQZnD1%2Bj6%2BGVuglDX9WPdekzygOYYhqGZLk3G%2BBgFn5vPnxqNN3fo6%2FEuuaEpIE5i5IEQXW5hMWGxT%2FyGFAZJjop99CvYLM0yV%2BwHePIePJaPPzfp6wxf57hR%2FMNoDP%2FG9CFKcvg5x%2BAB7wHXFl5wr6gW3EESGw82HEt%2Fan7%2BY1lyW%2BUiBzHeJXmEv23%2BLrNvYgjjCoZJCv0H%2FLZAwu7PAf4wcF%2Fo7zmqKCA58CcDSKLz%2BR62ryhLEJbwWQsOYF1Y2WAk7fu0Oo7MakUlKppQW%2BZUHQ7pSJgNFngytfmnG6P3zjfDfQdemh9S6b7rLx7YRS0sJ45mG2i2dfJZApKVLiZ0HrXGNfLsYycUuaPpu6WhC%2BOu4Sot1jPdegfmy3q9mlBYH0MlTSaumIGjcegGnQlTMQWzm6dMf7QQfVfbcN3KFNphl%2B4GgFerU72rt7W0GPOzM0%2Fb3ibiEk%2FjKcNDvDEWtklACatg4Y1nltHKVp3RYV3Fotua0udRMhKslhwlx6E0hbqmTQvHPG19Ieu7htqv2KlJO4MF1HLbLxKFGgX9UBBXC9UurVQpd%2BLsQtGVz%2BuGL02i2FUKDw01KndHbQ6Vdf8it8fLpF6nZ8wW53yznrIDiYOpifv6aThWktlI2NdxR4Is2k4uLSekZ4eycOB2SJUuYI7yZFrVT0%2F30L%2BL9adr%2FMfwfN%2BLdZvpqqAA94ZyLVw7ctAL%2BGzquuqriiKF50CqdVkKdEuadbGzDX2DZzmT19I1t1u2Z3WtzjejceLq%2B8qbSHPNkOdSPVI1ZCrSQGIdTaprFwwtxhuagnHuVv5gyXnRstys2NBrWXsjmgjGRYL9mjlNF1ptqlo9XZisedgDYjubB6ltLpy7zZTnJ%2B0gzeVgspQl01TWE8GLzILgXm6cbf0jJ5lwUoNAm0nX%2FnmikP%2ByZIgKFQzU5bB07c2FM9WMYx2Zhi1njRzRaKFRVXUG2mWUIMquQKk4tIPaycCja87MXI7VeKEFVOAfjtjq2zLVvdBlzZ0nMaBWXhFwVrLhFdOd%2BCltnsrY0hdd2mGgt14OZ16G40W8PB%2FH7HzjVB0ZDIbGfMhMj0dapOzV0KJNc%2B2NxOlC55M66mz71nhCz%2FrAKRR7sjntnXjWZrNyVZ8EbZ0M1%2B5Kymha3CjujFoZou9FcRbyo9MhdQcZH%2BqTTBlIndW6ZrRyvXVwuwLHsG33I9WElwhN27qGWPPYrqJK4LspFziAz9LlLBge90o2tS2ZkSWo7YXW3jWZtksNj%2BpWsDrLjeT3Vy1XM5hwXXcUqdYkCUxlrCpyvpBG130aWqYmHSTJlJlrTvhqMF%2FJsjXSM6qfwUqJl%2B1SDErL2uHOkR9vI1Xe3fxsU1up8iqQF%2BfUZJhYbRESh%2FVUz6edUDj148upAlqSKps%2Fn3O87viKJ6Z9bFHTgXykwNYXMbaArpusVmv1Rl1aTCgTMCXY6ON6Q%2FLIGZLzUCsvfTNZmqtSACVTYgaKnQ1sfdtSSb4ptSNJPDk3c3lo16OZHSvCgOqKnTVtHHlSNNi5uY6ctAKrmJwY8yx5fmrhSdfCU4xGY2ODFtKwbwzVWuoznk9z7smrs2HJ%2BWvuUC93U41yW85%2BqMlRZSxm8jzrCmeBG0%2F52UmkaSGYe%2FsxddGstrubzsSDlGUXpJeUXer8adS6yIE22PJ13tL8eZbEk%2Fgo5O5eLEdhrKxA4kpK0KbsrgjGojgEo%2BAoiu2wv9mrqJzLlioMxsYoySx2UwUsZ02YNetslWV77%2FQZR5sGw%2F12Molc3elm%2BRgux%2BRWOKr24eJ3TqruCLrXrlvB2GZYBXrG3BDpwk4RjVtrit3x58UhuZR5Njk4SzGQT955Y9UUX2k8IBl5ooOVf6twH4vW3fhS1uj3Be%2BbivgqrohE89FV0eBXg1T66Hp3WeROy5F37frQ89tK7BsJ9yrL7p4f2t%2FMQf%2BQT9p71dXQv6ls0l%2FAU9FQkigFOcJXhRqhGEVl1Lzz%2FDpOCYlmJvfx86segMgH%2BBGWeZIC8kMbiUSHSX3n9QPPl75f4fFG8rrq%2BKqy8avcvE10lyEfp706EWnz5kOY30b07Bk54vB%2Fg0jLbYi8L%2FR7pDfcr9wLEvBtWcC%2FxvN7vMaEpMA3sgsXSX58DJLqCkTeSzQIYLOB8NUX5dB%2Fau5AiInp6tkngg4Uv%2FP6IXNdrQ%2B72%2BBemaOrfPsLjLykjIv8rCQ%2BnO5klBf7f4%2Fgx9CD%2B07RtwMLwpS845KYVsqcHLhC8v0cYvzzEO6DCIXnK8TPw3mAKhj%2FJJRJwf%2F3s%2FiHxwyaAIX%2FZ5wQJpJlWsH8b%2Bf1RuvO5uXtwXbeSvOHjjfz98v421NkdvvRb99wdugfWPsf3hPs7WFESH%2F%2FPSkiL3hMHuusQL92nmkvBCjCpB2X0fYnpF2Qq%2FgnI13k4Hq%2FAOT%2F%2B8ThG7nf4Zzukxj%2Bcynyq%2BcU3zXiVxl4N73%2FNvz86b8%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