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="_1d0e416c-e722-4f51-b09e-2e275fb2de6c" Version="2.0" IssueInstant="2024-07-27T03:39:51Z" 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="#_1d0e416c-e722-4f51-b09e-2e275fb2de6c"><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>sArUO9aQ1WV5kQXcRdNEGnXkf0eGhkp2qfGhucHWGWk=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>Wy80uhgWEkZwHGePnPjoUDBjSdRhQ+ej/dHK/UlIe4HdN/k4gM2r1W0PxajRmJhnVxUiNxkQklKi52Rv3RETJceoWY5DfzjawRlfxsMNieH/fGre0wfshUPh44z74izTjJPX2UzVooQnFqjg/kU0cPeEUeRnvAlKZuDGmHn1mIz9hs83F0bKXMbMh9/AFYQW2O/qnqjBfwK2yhbHw0Khi+PsEh8ZCQIpqorsfkPeNyyAu6HTdtvKYV8lAXOyItNJYsrcdBSnwDT7NPfh+w5/K0XWfIxzYORRPfk/+5FJc5CXlu1SerZ5YVsWravMfL1dXVGW1PhHAAfavW4NHsqLBQ==</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%2BK4Fn7vX5GiH6nECzYGKsmUN7ABg7ExBl5uCVte8IYtL8Cvv4IkdDq9zMydmZrbT6AjnU%2Bfjo6OPvnxt2MS39WwQGGWPrWoB7L12%2FOnRwSS%2BDDgqzJIDZhXEJV3eFyKBteOp1ZVpIMMoBANUpBANCidgclr0wH9QA4ORVZmTha33rn83AMgBIsSE2jdqdJT6z%2BUS0KG6jr3kKPpe8Zjqfsd2Yf3NKQ51tvRLuw6rbvVG2kMgR0RqqCaohKkJTaRNHNPcvc0tyQ7g05%2FwFLb1p2E1xGmoLx6BWV5QAOCKNMQPIQuTMuwBNnOASl4cM7EUDeXJnHhThM7zBtPyL%2FRFLMUVQksTFjUoQMtY%2FoF7oKWlbAu4HWd5RVMPpawSEE8zfwwbT1fwzu4Mi6ef%2Br4SLwf%2BuiigRn6eAVVAV%2Bj66KXuTFC0zQPTechK3yCJkmSIPsEHuOi0P%2Fcev50d%2FfmDl019bIrmgjSLA0dEIfna1g0WAaZe8fHflaEZZD8AJsiKPKCfQ%2BPzr1DMennFnGZ4cscV4p%2FGI1k3pjeJ1kBPxcI3KMA0Gz3BfeCakAP4tg48M4y1KfW5z%2BWJddVLguQIi8rEvR183eZfRVDmNYwzg7QvUdvC8Ts%2FhzgdwP3SHzLUQp9nAN%2FMoA4Op9vYfuCsgJxBZ8RX1jzPlhQ9oqNFmvHcGfyKF1HHglHQXSgc28UVI5ij%2Bzo6crovfPVcNuBl%2BaHVLrt%2BouHfeqRVeDbcrRtlBHUU32fWZKwN10jWLThnnCVCWHFKmQUd0ZEjK%2FRBWWT%2BhHsjWQcpKujFc6O0SKKJyFLG3XHkJdjB2b2hpW88x40RuwdkTYLoUJ4owKSjYcCSw8Y5swx4Xm5H%2Btr2jqvsmyRDvO9T0QW6ehQtqCR1nw82VbSKFFSKlHP%2FQD1OkNyN1lrOy3oE%2Fxws7DpOZGn%2BV7wmgl9CnZKQ06CsK0jOehtxYV6yLMCeZEOZ6cTX3WVpVvWk82qF%2FPr%2BUktZ%2BMNKhxXMNNGWnIz3QvaDUtMyLXtqcfzZm4YuhcRbXY4dlhxHVcULiVbdrNCdgFqzZtS7no1sik9UHjeA7XNzBSUT4XF09Mt9O9i%2FekS%2Fwk83fZizZJ9CZTg1hAvhcvDB72Ez5qqSq4kinx88vlGFXhfNXi9j6xd7E4ZitYY%2BbCmvRWrN4202Iwn2VYNamfGL2TMgG%2FGkhxqIj%2FiKUvmm2YLFIN0FK07PfVrd7SinWRVbWwqdjpGME1m3emZh8OGPM6XcqNJcjNfapS2DwC2nbQ9z2pL62bThMVR3vMLwZ%2BtBF7TxPWs6yRaiXHPV86m%2BpGTgDlJvi%2Fr%2FKV%2FkYn4v8BPObHtj6SVUm3NzZnWpJymLIGAHWsdWty0E47rujeSz%2BMsbJs1qESLsEI2GzlEQ2v5lqZkptsBEnD3ETKGptDun4mqoU%2BzFLRtp%2FRpI9sworaduQdCO1apoS77hEVCZ71SdCdH6TJdnaIJtdhYdU8AI2W6UMh5FBFc27QVg9C0tTPm5kuVyZqktxsakxmhD4FViuZscwysVGepvLKbY1deZ8p6a%2FM5QXAbcau37SnnOkmax8z4uD9sRzkTq7NcHPE9e92QcrXeWYitQRSz5jCRNHhOwjmryiGlRWyd1F2mf6B9CzD5YaX7ShSI%2Bdw0BFLgoRx0O8FWI9ltW4mkXdforTa8O7Q7W3lKxuumJ%2FKNzPNgLiBJFIolP77sk2JoMr%2FneU0gLznhSv7CFgRjrObtYQ5rMV2xFedXhuGhXsRMdokkeFc%2FU5NtSbB9YXk6aCSZSh1MYr%2Beq8W8F3ePw%2FR8rIGcHcTNn885RrVc0eEOQ2S05yMhaoOdyyFkAFXVKLmRm420MshYwGCiv1EnzQbnkaXg89CIL326wC8k3oe8xpMj0cxHprrrSDjfxMbieQafm4WgmM1YN1OxO2r3ud6amEaMpR2phbZOrEMN7BSfGO3EO%2B7BQLO%2BgeYoHE%2Bmm3DJK8OpIjX8kHRcgt4enSZXKtpd0%2Ftm5c3l9rZjBYosJPV0qQuLvN89denJnNGPHEF0%2FYUTTNpn2WC33lzn9nyen0O1apuVyhzHnbPgy6Md0xQd2V3kWTpLo26xDbhqHKeiDbItL%2Fps2%2BxzYMJxChj7Ecex8XATSGG1EAypO5pMx1luUJvap2hjRq4payeu2MAakpY895VgN5slW9Xq58UErib4Vogkc392e0dJtbqqwzYdf2KSlAid6WLKEaV5CAnUWbcpjzkt99m5KvLZ3lpxvnB0ThujaTO1zACckUfCt91rhftYtG7Gl7JGvC94X1XEV3GFJZobXhQNejXwlRte7i4D32lF6Fy6PvT8XIl9JeFeZdnN80P7qzmI7%2FI5DF51NXSvKhv3l%2FBY3olZcgBFiC4KNQnTMKmS1o3nl3FijDUzvo%2BfX%2FUADF2AHmBVZAeAf4hpxhNx1tx4fcfzpe8HPN5IXladXlQ2epWb14luMuTjtBcnLG3efDDz64iBqeMjDv83iEO1i0PnkXiP9Ib7hXuJA76rSvjXeH6LdzfDKfCV7EJlVkQPflZfgPB7iQA%2BbN2F6OIbFtB9ankgRth08RxiQQfK33n94Lku1nvvOnhQFeFFvv0FRk5WpWVxEjMXzj0hLMrg3yP4MfTgtlPE9cCC%2BIDfcVlKiFWBD1zJu24BEfp1CA9BEsanC8Svw3kU1jD9RSjjgv%2FvZ%2FF3jxnUQBj%2Fn3EKEZYs8xoWfzuvN1o3Ni9vD6r3Vpo%2FdLyZv13G354i%2BvVHvX7D8cJ%2FYO1%2FeE%2BQE8AEk%2F72e1KCX%2FAIP9apLvHaeSKcGIQJwu20Sna%2FIO0SX8W%2FGOmyAJf7BYTuv08cvpH7Hc6HIEvhP5ciPzyn6KYRv8jAm%2Bn9t%2BHnT%2F8F"
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