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="_07ec4e19-47a3-47db-838c-e10a8407f36d" Version="2.0" IssueInstant="2024-03-28T15:23:46Z" 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="#_07ec4e19-47a3-47db-838c-e10a8407f36d"><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>l3fva17CZE9+DkVvG2ZS6GTkUF8XJkM0RwTkA0QCozQ=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>DEgYIxP26VQxN6EEn420UMWWf5DmkaN9Z+qaVzNDOXh3P1JdLCWnA+BIiYd5ow12J2rYT/GH8v7V4cfGQnpSJlB2BYkqmf50L4YyJZ0tmnkKHUXW6Xo5PT50JH20poV4yKf1kfpmn8O6rdhI4LotH5q1RotFim8vZ5kX514AH0TvvYOWV/v1PFcCkTPg75FedCPTWvruS3DFpgkFpmLHUVNTAxSyWAEOAlv/oRdHqictudQ//pw2jLeXqhtwRGr4KZmLHjyS8IU8Th0zz9+qeiDclwA5zZxKxxy1UNboqJ/NvaGC/8MQsPxt8UDKH25GsHnjccqoR89Xjs7tlxt/Bw==</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=1VhZc%2BK4Fn7vX0HRj1TiBRsD1cmUN7DBZrExi19uCVsY493yBr%2F%2BCpLQ6XTPdmem5vZLiI50Pn06Ojr65C%2B%2FNFHYqmCO%2FCR%2BalOPZPuX509fEIjCdMiXxTE2YFZCVLTwuBgNbx1P7TKPhwlAPhrGIIJoWDhDk9e1If1IDtM8KRInCdvvXH7bAyAE8wITaLdU6an9H5KDDgOpwQPDgS7%2B4%2B4f%2Bt2%2B8wApEvQZkjt0e267tX4jjSGwI0IlVGNUgLjAJpJmHsjuA91fUeyQ7g6Znt1uSXgdfgyKm9exKFI0JIgi9sGj78K48AuQ7B0Qg0fnQowW5sokrtxpYo95O%2B0W%2F0ZTTGJURjA3YV75DrQM7SvcFS0pYJXD2zqLG5jcFDCPQaglnh%2B3n2%2FhHd4Y58%2B%2F6fiFeD%2F0i4uGpu%2FhFZQ5fI2ui17mxgh1XT%2FW3cck9wiaJEmCHBB4jIt873P7%2BVOr9eYOXTU%2BJDc0EcRJ7Dsg9C%2B3sOiwOCZuiw%2B9JPeLY%2FQr2BRBkVfsB9g4Dw7FxJ%2FbxHWGr3PcKP5hNJJ5Y%2FoQJTn8nCPwgI6AZnsvuFdUAx4gjo0DW5ahPrU%2F%2F7Esua1ylYMYHZI8Qt82f5fZNzGEcQXDJIXuA3pbIGb35wB%2FGLgvxPccJd%2FDOfAnA4ij8%2Fketq8oaxCW8DnsHipAcaItDzpSsK7GtG32xqvAGvW3k0AnjXoV8ORSTC7Lpxuj9843w30HXpofUum%2B6y8ekuzt1GZB99bLZtaT5ZihSUvfbA6sFAVgNrA7GVhfZtJ8e%2BwuqImriZuY7wiqv3PZpKboCZ3vVsRY6VfcmnEO42WcmpNQoIVdkEUHltSY3Xlik0UUB1PF2m5624RdrFhyotBkmqyZ8%2FRABYc0ivvzXu4eVUZLCoXNKCMpRn7Ur2w22LIUwyvkqqp2882aqKjFyBGD1cLj2BF0xcVqU%2BWl2ZVGqReM0khTrPVsxTfmecPLcz6siMRwlcx3itJdEkRa0ycNbrNjURvjnJna2OF0Nvuq1V8dyctl0MmgLzlhzbMXu5k2zZmyZvskmxCzCoxFoq8v0aIp%2BpY0VWh2jJT45DhZYvQH2xPiirApCKF%2BerqH%2Fl2sP13jP4Xn%2B15sWXIggQLcG%2BK1cB3wQS%2Fgs66qkiuJIh%2BePb5WBd5TDX4xQNY%2BdDWGonVGTrf0Yc0u6lpa7ibTxFaPlTPjl7ImLPl6Ism%2BLvJjnrJkvq5toBiko%2Bg97Tyo3PGadqJ1udtQodM1jlo062kXHo5qspmv5FqX5Hq%2B0in9dATYdtZPPKuvrLtNF5aNfOKXgjdbC7yui9tZz4n0AuNebpxN9SMnAXOSPE9e8Nf%2BZSLi%2FwVe48SON5bWSmmbuwutSxlNWQIBu9bWtzit60%2Bqqj%2BWL5PE75gVKEWLsHw2GTtETeuZTVMy0%2BsCCbinABkjU%2BgMLkRZ0%2BdZDDobp%2FBoI9kxom7P3JTQmzI21NWAsEjobNfKwslQvIrX52BKLXdW1RfAWNGWCjkPAoLrmBvFIHR960y4%2BUplkjrq70fGdEYsRsAqRHO2a45WvGCprNzUTU%2FeJsrW3vAZQXA70V50NhrnOlGchcykOaX2OGNCdZaJY76%2F2dakXG73FmIrEISsOYokHV4if86qsk%2FpAVtFVY8ZpLRnASZL1wtPCY5iNjcNgRR4KB973aOtk6zdUQJp3zP66x3vjjZdW9bIcFv3Rb6WeR7MBSSJQr7iJ9d9Ugxd5k88rwvkNSdcyVtuBMGYqFlnlMFKjNdsyXmlYRxQP2Cm%2B0gSDjc%2FU5c3krDxhNU51UkylrqYxGk7V%2FN5P%2Bw1o%2FjSVEBOUnH353OOUS1XdLh0hIzOfCwEHbB3OYQMoKo6JddyvZPWBhkKGEzEhWpa73AeWQo%2BD7X40rcQ%2BKXEe5DXeXIsmtnYVPddCeebWFs8z%2BBzsxQUs54szFjsjTsDrr8ltICx9IZa6tvISiuwifGJ0c%2B846YGmg0MNEf%2BZKrt%2FBWvjDRFqvkR6bgEbTdOnSkl7W7pU70%2BzOWO3bWOiixElbZaCMts0Dv36OmcWTQcQfS8pXOcdi6ywdqH%2BYI78Vl28dWyY5Yq00y6F8GTx3umzruyu8ySeBYHvdw%2BcuUkjMUNSGxe9NiOOeDAlOMUMPECjmPD0e4o%2BeVSMKTeeKpNksygdpVH0caM3FLWXlyzR2tEWvLcU4772SyyVWuQ5VO4nuJbIZDM08XtN5Jq9VSHrbve1CQpETraUuOIwkx9AnW3HerAnFen5FLm2exkrTlPaJzzzqg7TCUzAGdkQ3gb91bhPhatu%2FGlrBHvC943FfFVXGGJ5vpXRYNeDXzp%2Bte7y8B3Wo5rNu760PPbSuwbCfcqy%2B6eH9rfzEH8kE86fNXV0L2pbNxfwKZoiUmUgtxHV4Ua%2BbEflVH7zvPrODHEmhnfx8%2BvegD6LkCPsMyTFOAfQkt4IkzqO68feL70%2FQqPN5LXVcdXlY1e5eZtorsM%2BTjt1QlLmzcfzPw2Ymgu8BGH%2FxtEWu5D3%2FlCvEd6w%2F3KvcAB35cF%2FGs8v8drzXAKfCO7UJHkwaOXVFcg%2FF4igAfbLR9dff0cuk%2FtAwgRNl09R1jQgeJ3Xj94rqv14XAbPCxz%2Fyrf%2FgIjJynjIj%2BLiQvnB8HPi%2BO%2FR%2FBj6MF9p4jbgQVhit9xSUyIZY4PXMG7bg4R%2BnkIj0Dkh%2BcrxM%2FDeexXMP5JKOOC%2F%2B9n8Q%2BPGdSBH%2F6fcfIRlizzCuZ%2FO683Wnc2L28Pqv9Wmj90vJm%2FX8bfniKL2496%2B4Zz8P%2BBtf%2FhPUHOEUaY9PffkyL8gkf4sU71iNfOM%2BGEwI8QbsdltP8JaRf4Kv7JSBc5uN4vwHf%2FfeLwjdzvcE6PSQz%2FuRT51XOK7hrxqwy8m95%2FG37%2B9F8%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