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="_0ab149da-000c-4f02-a1aa-c6ae130e1e68" Version="2.0" IssueInstant="2023-01-31T05:07:50Z" 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="#_0ab149da-000c-4f02-a1aa-c6ae130e1e68"><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>brFd8bxtqZ5eKS1ScAIJdUX9Z/XvazPwuwtsQQWZU5M=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>c1TYjq1ATQr9M5/fH7EXopl69Q4BkDvcNkk4+MZ2AvGdSnDNKdHJII+nB0Hfa5jug1iPyEkWp3q25wA6ZNVxpNrTWpoJNKeTNdeJWggwQHuEGnJxuAXfSS7Lm71nIImJCxgltnhFs3bBlU9QEk89hD97ZzQ/w9S0kRNoJUN+v5Dw4tSoKEZE7XUkPLL+8M8wPrmI1j6cqa0CNdm5g2Z1+dayU6BJCosz20MOtJahhPh6Z7X8Ozj1piOU84H744oNroVawXyIzIs7nZlUbp2W+SlTD3I34n/B+uUXwfaQpSEleBT9zmCKkzDEwPRckNG8EEyaHo08VEhaQChO6AMeUA==</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=1VjZkuK4En3vryDoR6LKC16A6KoJb4ABG2xjFr%2FcELawDd7lBfj6K6gqurq6Z7szE3P7CZRSHh2lMqUjf%2FnlFEetGhYoTJOnNvVItn95%2FvQFgTjKBkJVBokJ8wqisoXHJWhw63hqV0UySAEK0SABMUSD0h1YgjYb0I%2FkICvSMnXTqP3O5bc9AEKwKDGBdkuVn9r%2FIcGOYvoeeCBJ0n1g9iT9ACgAHlwOQKpLQgpyvXZr9UYaQ2BHhCqoJqgESYlNJN19IKmHLrUk2QHJD1jSabdkvI4wAeXNKyjLDA0IokxC8Bh6MCnDEqQ7FyTg0b0Qw4W1tIgrd5rYYd5uuyW80ZTSBFUxLCxY1KELbXP2Fe6KlpawLuBtneUNTDmVsEhANEv9MGk%2F38I7uDEunn%2FT8QvxfugXDw2s0McrqAr4Gl0PvcyNEZqmeWy6j2nhEzSOHEH2CTzGQ6H%2Fuf38qdV6c4eemuzTG5oEkjQJXRCFl1tYNFgGqdcSIj8twjKIfwWbIijyiv0AT%2B6DSzHJ5zZxneHrHDeKfxiNZN6YPsRpAT8XCDygANAs94J7RTXhHuLYuLBlm%2BpT%2B%2FMfy5LbKpcFSNA%2BLWL0bfN3mX0TQ5jUMEoz6D2gtwVidn8O8IeB%2B0J8z1EOfZwDfzKAODqf72H7irICUQWfd8XQ6%2B1OZe6wcGpRliuoE8%2Fe9B1iU4PLoqmaEhnG2rFZ7enG6L3zzXDfgZfmh1S67%2FqLh0stt4ecEpZG0ddYYj%2FmlU2aRVzfYMSjXLv68ch0NIcW6pFnJbI%2B9cYTVe0kIjneA%2FZQ%2BVS4OCvHddbNabYROEdfnTK9WK6zdKJP4VL34GTt%2B40xrpRRMjlVwmZvWfws5qlEVeOJdPKjMgmGqLsTI7tvKMdeP5D7vHMxiKZvkUdTTye23qlZuWFKK50qjsJv7ONiNuv0tF6zKGKVOnBuDkhJ92LWpx2q44GzzYkTKUUXmtTm5QQEwSLgHH7Tm18OVBbO7R4z5hkm1Yt0BZrNWb2oiE%2BcyN5l9LpjRUu5q3aZhBA7lb1p9sDILCWC4rJ%2FiaXp8SIrzcJ0j%2FqopyhnME7J3koJgCEFc07QoC08Pd1D%2Fy7Wn67xn8LzfS82LNmXQQnuDel6cO1xoZfwWVNV2ZMlSYjOvtCoouCrprDoI3sXeTOGojVGyTb0fsUumkY2tpNp6qgB3jDBUGaiITQTWQk1SRgJlK0ITeOAsUm6Y42bnfu1N1rRbryqtmsqcrtmMIt1bnYR4LAhT%2FOl0mh4gfOlRmmHAGDbWTsIrLa07zZNNE7KQTBEX1%2BJgqZJG51zY63EuJcbZ0v9yEnEnGTfVxbCtd9IJfxfFGa81PFH8mpcOdb2QmtyTlO2SMCuvQltftYNJ3XdGymXSRp2rBpUkk3YIZuOXKKhtdyhKYXhukAG3uGIzKEldvoXomros56AztotfdpMt4ykObqXEdqpSkx12SdsErqb1Xjh5ihZJqvzcUoZW7vuiWA0nhljcn48EnzHWo9NQtM27oSfL1UmbeLebmhOdWIxBHYpWfr2FNjJgqXyat2cOFw2442zFnKC4LeSs%2BisZ7znxkkeMZPTIXNGOROpei6NhN5605BKtdnZiK3BMWKtYSxr8BKHc1ZVQko7snVcc0w%2Fo30bMHm2WvjjYyDlc8sUSVGASsB1A0cjWaczPso7zuyttoI3XHcdZUZGm6YnCY0iCGAuIlkSi6Uwue7T2NQU4SAImkhec8KTfWMtiuZEzTvDHNZSsmIr3q9Mc496R2a6i2Vxf%2FOzNGUti2tfXJ4zjSQTuYtJHDZztZj3Iu40TC6nGihpJm3%2FfM4xqu1JLp8NkdmZj8RjB%2Bw8HiETqKpGKY3SbOWVSUYiBpP8rTpttjiP7DGuh0Z66VuIgiELPhQ0gRxJVj6y1F1XxvkmNbYgMLhuDHFsNZOFlUjcqNPnextidmRs7UQZ2ia2sxqsE1wx2llwvcxEet9EcxROprNtuBTGw9lYboQh6XoE7ZzcJh9XtLehD81qP1c6TtcOxooY17PlQjTyPnfm6OmcWZx4guB8ww2mnYtiss5%2BvuAPQp5fQrXqWJXKnCbdi%2Bgrox3TFF3FM%2FI00ZMjVzgBX02iRFqD1BEkn%2B1YfR5MeX4MJv6R59louA3ksDJEU%2BZG09kkzU1qW%2FsUberkhrJ30ooN7CFpK3N%2FHOx0PXZUu58XU7ia4lvhKFuHi9c7yarNqS7bdP2pRVISdGfGjCdKKwsJ1N10qD1zXh7SS1Xk%2BsFe8b54cs9bs%2BkwtcIAnJEnwl97txPu46F1N74ca8T7A%2B%2BbE%2FFVXGGJ5oVXRYNeDULlhde7y8R3WhG6164PPb%2BtxL6RcK%2By7O75of3NHMQP%2BWSDV10NvZvKxv0lPJUtKY0zUIToqlDjMAnjKm7feX4dJ0VYM%2BP7%2BPlVD8DQA%2BgRVkWaAfxDzFKBiNLmzusHni99v8LjjeR11clVZaNXuXmb6C5DPk57dcLS5s0HM7%2BNGFgLXOLwf4PIql0Uul%2BI90hvuF%2B5lzjgu6qEf43n93gtHafAN7ILlWlxfPTT%2BgqE30sE8GG7FaKrb1hA76m9BxHCpqvnEAs6UP7O6wfPdbU%2B7G%2BDB1URXuXbX2DkplVSFmcp9eB8L4ZFGfx7BD%2BGHtx3irgVLIgy%2FI5LE0KqClxwpeB5BUTo5yE8BHEYna8QPw%2FnUVjD5CehjA%2F8fz%2BLf1hmUANh9H%2FGKURYssxrWPztvN5o3dm8vD2o3tvR%2FKHjzfz9Mv72FFncftTbN5x9%2BA%2Bs%2FQ%2FvCXIDGGPS339PivELHuHHOsURr51nwo1AGCPcTqp49xPSLvFV%2FJORLgtwvV9A6P37xOEbud%2FhnAVpAv%2B5FPnVOkV3jfhVBt5N778NP3%2F6Lw%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