{"id":40865,"date":"2020-02-05T10:07:04","date_gmt":"2020-02-05T07:07:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961"},"modified":"2020-02-05T10:07:04","modified_gmt":"2020-02-05T07:07:04","slug":"sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>W ka\u017cdej du\u017cej firmie, w tym r\u00f3wnie\u017c X5 Retail Group, wraz z rozwojem wzrasta liczba projekt\u00f3w, w kt\u00f3rych wymagana jest autoryzacja u\u017cytkownik\u00f3w. W miar\u0119 up\u0142ywu czasu potrzebny jest p\u0142ynny przeskok u\u017cytkownik\u00f3w z jednego aplikacji do drugiej, co rodzi konieczno\u015b\u0107 wykorzystania jednego serwera Single-Sign-On (SSO). Jak jednak post\u0105pi\u0107, gdy takie dostawcy to\u017csamo\u015bci jak AD lub inne, nie posiadaj\u0105ce dodatkowych atrybut\u00f3w, ju\u017c funkcjonuj\u0105 w r\u00f3\u017cnych projektach? Z pomoc\u0105 przychodz\u0105 klasy system\u00f3w nazywanych \u201ebrokerami to\u017csamo\u015bci\u201d. Najbardziej funkcjonalni w tej grupie to m.in. Keycloak, Gravitee Access Management itd. Scenariusze u\u017cycia mog\u0105 by\u0107 zr\u00f3\u017cnicowane: interakcja maszynowa, udzia\u0142 u\u017cytkownik\u00f3w itd. Rozwi\u0105zanie powinno wspiera\u0107 elastyczn\u0105 i skalowaln\u0105 funkcjonalno\u015b\u0107, kt\u00f3ra zjednoczy wszystkie wymagania w jednym \u2013 obecnie takim rozwi\u0105zaniem w naszej firmie jest broker to\u017csamo\u015bci \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a7f1d5f68fa5d07fc30f2804dc62bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKeycloak to produkt o otwartym kodzie \u017ar\u00f3d\u0142owym, przeznaczony do identyfikacji i kontroli dost\u0119pu, wspierany przez firm\u0119 RedHat. Jest podstaw\u0105 dla produkt\u00f3w firmy, kt\u00f3re wykorzystuj\u0105 SSO \u2013 RH-SSO.<\/p>\n<h3>Podstawowe poj\u0119cia <\/h3>\n<p>\nZanim zaczniemy analizowa\u0107 rozwi\u0105zania i podej\u015bcia, nale\u017cy zdefiniowa\u0107 terminy oraz kolejno\u015b\u0107 proces\u00f3w:<\/p>\n<p><img decoding=\"async\" alt=\"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identyfikacja<\/b> \u2014 to procedura rozpoznawania podmiotu na podstawie jego identyfikatora (m\u00f3wi\u0105c pro\u015bciej, jest to okre\u015blenie imienia, loginu lub numeru).<\/p>\n<p><b>Autoryzacja<\/b> \u2014 to procedura weryfikacji autentyczno\u015bci (u\u017cytkownik jest weryfikowany za pomoc\u0105 has\u0142a, e-mail jest sprawdzany za pomoc\u0105 podpisu elektronicznego itd.)<\/p>\n<p><b>Autoryzacja<\/b> \u2014 to udzielenie dost\u0119pu do jakiego\u015b zasobu (na przyk\u0142ad do poczty elektronicznej).<\/p>\n<h4>Broker to\u017csamo\u015bci Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 to rozwi\u0105zanie do zarz\u0105dzania to\u017csamo\u015bci\u0105 i dost\u0119pem o otwartym kodzie \u017ar\u00f3d\u0142owym, przeznaczone do stosowania w systemach informatycznych, w kt\u00f3rych mog\u0105 by\u0107 wykorzystane wzorce architektury mikrous\u0142ug.<\/p>\n<p>Keycloak oferuje takie funkcje jak jednolite logowanie (SSO), brokered identity i logowanie za pomoc\u0105 medi\u00f3w spo\u0142eczno\u015bciowych, federacja u\u017cytkownik\u00f3w, adaptery klienckie, konsola administracyjna oraz konsola zarz\u0105dzania kontami.<\/p>\n<p>Podstawowa funkcjonalno\u015b\u0107 wspierana w Keycloak:<\/p>\n<ul>\n<li>Single-Sign On i Single-Sign Out dla aplikacji przegl\u0105darkowych.<\/li>\n<li>Wsparcie dla OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identity Brokering \u2013 autoryzacja z wykorzystaniem zewn\u0119trznych dostawc\u00f3w to\u017csamo\u015bci OpenID Connect lub SAML.<\/li>\n<li>Social Login \u2013 wsparcie dla Google, GitHub, Facebook, Twitter w celu identyfikacji u\u017cytkownik\u00f3w.<\/li>\n<li>User Federation \u2013 synchronizacja u\u017cytkownik\u00f3w z serwer\u00f3w LDAP i Active Directory oraz innych dostawc\u00f3w to\u017csamo\u015bci.<\/li>\n<li>Kerberos bridge \u2013 u\u017cycie serwera Kerberos do automatycznej autoryzacji u\u017cytkownik\u00f3w.<\/li>\n<li>Admin Console \u2014 do centralnego zarz\u0105dzania ustawieniami i parametrami rozwi\u0105zania przez Web.<\/li>\n<li>Account Management Console \u2013 do samodzielnego zarz\u0105dzania profilem u\u017cytkownik\u00f3w.<\/li>\n<li>Dostosowanie rozwi\u0105zania w oparciu o firmowy styl.<\/li>\n<li>2FA Authentication \u2013 wsparcie dla TOTP\/HOTP z wykorzystaniem Google Authenticator lub FreeOTP.<\/li>\n<li>Login Flows \u2013 mo\u017cliwo\u015b\u0107 samodzielnej rejestracji u\u017cytkownik\u00f3w, odzyskiwania i resetowania has\u0142a oraz inne.<\/li>\n<li>Session Management \u2013 administratorzy mog\u0105 zarz\u0105dza\u0107 sesjami u\u017cytkownik\u00f3w z jednego miejsca.<\/li>\n<li>Token Mappers \u2013 mapowanie atrybut\u00f3w u\u017cytkownik\u00f3w, r\u00f3l i innych wymaganych atrybut\u00f3w w tokenach.<\/li>\n<li>Elastyczne zarz\u0105dzanie politykami przez realm, aplikacje i u\u017cytkownik\u00f3w.<\/li>\n<li>Wsparcie CORS \u2013 klientowe adaptery maj\u0105 wbudowane wsparcie CORS.<\/li>\n<li>Service Provider Interfaces (SPI) \u2013 wiele SPI, kt\u00f3re pozwalaj\u0105 na konfiguracj\u0119 r\u00f3\u017cnych aspekt\u00f3w pracy serwera: strumieni autoryzacji, dostawc\u00f3w to\u017csamo\u015bci, mapowania protoko\u0142\u00f3w i innych.<\/li>\n<li>Klientowe adaptery dla aplikacji JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Wsparcie dla pracy z r\u00f3\u017cnymi aplikacjami wspieraj\u0105cymi OpenID Connect Relying Party library lub SAML 2.0 Service Provider Library.<\/li>\n<li>Mo\u017cliwo\u015b\u0107 rozbudowy z u\u017cyciem plugin\u00f3w.<\/li>\n<\/ul>\n<p>\nDla proces\u00f3w CI\/CD, a tak\u017ce automatyzacji proces\u00f3w zarz\u0105dzania w Keycloak, mo\u017cna korzysta\u0107 z REST API\/JAVA API. Dokumentacja dost\u0119pna w formie elektronicznej: <\/p>\n<p>REST API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html<\/a><\/noindex><br \/>\nJAVA API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html<\/a><\/noindex><\/p>\n<h4>Dostawcy to\u017csamo\u015bci na poziomie przedsi\u0119biorstwa (On-Premise)<\/h4>\n<p>\nMo\u017cliwo\u015b\u0107 autoryzacji u\u017cytkownik\u00f3w przez us\u0142ugi User Federation.<\/p>\n<p><img decoding=\"async\" alt=\"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cna tak\u017ce wykorzysta\u0107 autoryzacj\u0119 jednolit\u0105 \u2013 je\u015bli u\u017cytkownicy s\u0105 autoryzowani na stacjach roboczych z Kerberos (LDAP lub AD), mog\u0105 by\u0107 automatycznie autoryzowani w Keycloak bez potrzeby ponownego podawania swojej nazwy u\u017cytkownika i has\u0142a. <\/p>\n<p>Do uwierzytelniania i dalszej autoryzacji u\u017cytkownik\u00f3w mo\u017cna wykorzysta\u0107 relacyjn\u0105 baz\u0119 danych, co jest najbardziej przydatne w \u015brodowiskach deweloperskich, poniewa\u017c nie wymaga d\u0142ugotrwa\u0142ej konfiguracji i integracji na wczesnych etapach projekt\u00f3w. Domy\u015blnie w Keycloak u\u017cywana jest wbudowana baza danych do przechowywania ustawie\u0144 i danych o u\u017cytkownikach.<\/p>\n<p>Lista wspieranych baz danych jest obszerna i obejmuje: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle i inne. Najbardziej przetestowane do tej pory s\u0105 Oracle 12C Release1 RAC oraz klaster Galera 3.12 dla MariaDB 10.1.19. <\/p>\n<h4>Dostawcy identyfikacji \u2014 logowanie spo\u0142eczno\u015bciowe <\/h4>\n<p>\nMo\u017cna korzysta\u0107 z logowania z medi\u00f3w spo\u0142eczno\u015bciowych. Aby aktywowa\u0107 mo\u017cliwo\u015b\u0107 uwierzytelniania u\u017cytkownik\u00f3w, u\u017cywana jest konsola administratora Keycloak. Zmiany w kodzie aplikacji nie s\u0105 wymagane, a ta funkcjonalno\u015b\u0107 jest dost\u0119pna 'prosto z pude\u0142ka' i mo\u017ce by\u0107 aktywowana na ka\u017cdym etapie realizacji projektu.<\/p>\n<p><img decoding=\"async\" alt=\"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDo uwierzytelniania u\u017cytkownik\u00f3w mo\u017cna wykorzysta\u0107 dostawc\u00f3w OpenID\/SAML Identity.<\/p>\n<h3>Typowe scenariusze autoryzacji z wykorzystaniem OAuth2 w Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2014 u\u017cywany z aplikacjami serwerowymi (server-side applications). Jeden z najcz\u0119\u015bciej stosowanych rodzaj\u00f3w zezwole\u0144 na autoryzacj\u0119, poniewa\u017c dobrze nadaje si\u0119 do aplikacji serwerowych, w kt\u00f3rych kod \u017ar\u00f3d\u0142owy aplikacji i dane klienta nie s\u0105 dost\u0119pne dla os\u00f3b trzecich. Proces w tym przypadku opiera si\u0119 na przekierowaniu (redirection). Aplikacja musi by\u0107 w stanie komunikowa\u0107 si\u0119 z u\u017cytkownikami agentami (user-agent), takimi jak przegl\u0105darka internetowa \u2014 otrzymywa\u0107 kody autoryzacji API przekazywane przez u\u017cytkownika agenta.<\/p>\n<p><b>Implicit Flow<\/b> \u2014 u\u017cywany w aplikacjach mobilnych lub internetowych (aplikacje dzia\u0142aj\u0105ce na urz\u0105dzeniu u\u017cytkownika).<\/p>\n<p>Niejawny typ autoryzacji jest stosowany w aplikacjach mobilnych i internetowych, gdzie poufno\u015b\u0107 klienta nie mo\u017ce by\u0107 zagwarantowana. Niejawny typ uprawnie\u0144 wykorzystuje tak\u017ce przekierowanie agenta u\u017cytkownika, przy czym token dost\u0119pu jest przekazywany agentowi u\u017cytkownika do dalszego wykorzystania w aplikacji. Dzi\u0119ki temu token jest dost\u0119pny dla u\u017cytkownika i innych aplikacji na urz\u0105dzeniu. W tym typie autoryzacji nie dokonuje si\u0119 weryfikacji autentyczno\u015bci aplikacji, a ca\u0142y proces polega na URL przekierowania (wcze\u015bniej zarejestrowanym w serwisie).<\/p>\n<p>Implicit Flow nie obs\u0142uguje token\u00f3w od\u015bwie\u017cania (refresh tokens).<br \/>\n<br \/>\n<b>Grant typu Client Credentials<\/b> \u2014 jest u\u017cywany, gdy aplikacja uzyskuje dost\u0119p do API. Ten typ uprawnie\u0144 zazwyczaj stosuje si\u0119 w interakcjach 'serwer-serwer', kt\u00f3re musz\u0105 przebiega\u0107 w tle bez bezpo\u015bredniego zaanga\u017cowania u\u017cytkownika. Strumie\u0144 przyznawania danych uwierzytelniaj\u0105cych klienta pozwala us\u0142udze internetowej (poufnemu klientowi) na u\u017cycie w\u0142asnych danych uwierzytelniaj\u0105cych zamiast reprezentacji u\u017cytkownika do weryfikacji przy wywo\u0142aniu innej us\u0142ugi internetowej. Dla wy\u017cszego poziomu bezpiecze\u0144stwa mo\u017cliwe jest, aby wywo\u0142uj\u0105ca us\u0142uga korzysta\u0142a z certyfikatu (zamiast og\u00f3lnego sekretu) jako danych uwierzytelniaj\u0105cych.<\/p>\n<p>Specyfikacja OAuth2 jest opisana w <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6749\">RFC-6749<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc8259\">RFC-8252<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6819\">RFC-6819<\/a><\/noindex><\/p>\n<h3>Token JWT i jego zalety<\/h3>\n<p>\nJWT (JSON Web Token) to otwarty standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), kt\u00f3ry definiuje zwarty i samodzielny spos\u00f3b na zabezpieczon\u0105 wymian\u0119 informacji mi\u0119dzy stronami w postaci obiektu JSON.<\/p>\n<p>Zgodnie z definicj\u0105 token sk\u0142ada si\u0119 z trzech cz\u0119\u015bci w formacie base-64, oddzielonych kropkami. Pierwsza cz\u0119\u015b\u0107 nazywa si\u0119 nag\u0142\u00f3wkiem (header), w kt\u00f3rym znajduje si\u0119 typ tokena i nazwa algorytmu hash s\u0142u\u017c\u0105cego do uzyskania podpisu cyfrowego. Druga cz\u0119\u015b\u0107 przechowuje podstawowe informacje (u\u017cytkownik, atrybuty itd.). Trzecia cz\u0119\u015b\u0107 to podpis cyfrowy.<\/p>\n<p>..<br \/>\nNigdy nie przechowuj tokenu w swojej bazie danych. Poniewa\u017c wa\u017cny token jest r\u00f3wnowa\u017cny has\u0142u, przechowywanie tokenu jest r\u00f3wnoznaczne z przechowywaniem has\u0142a w otwartej formie.<br \/>\n<b>Access token <\/b>\u2014 to token, kt\u00f3ry zapewnia dost\u0119p jego w\u0142a\u015bcicielowi do zabezpieczonych zasob\u00f3w serwera. Zwykle ma kr\u00f3tki czas \u017cycia i mo\u017ce zawiera\u0107 dodatkowe informacje, takie jak adres IP strony, kt\u00f3ra \u017c\u0105da tego tokena.<\/p>\n<p><b>Token od\u015bwie\u017cania <\/b>\u2014 to token, kt\u00f3ry pozwala klientom \u017c\u0105da\u0107 nowych token\u00f3w dost\u0119pu po up\u0142ywie ich czasu \u017cycia. Te tokeny s\u0105 zazwyczaj wydawane na d\u0142u\u017cszy okres.<\/p>\n<p>G\u0142\u00f3wne zalety stosowania w architekturze mikroserwis\u00f3w:<\/p>\n<ul>\n<li>Mo\u017cliwo\u015b\u0107 dost\u0119pu do r\u00f3\u017cnych aplikacji i us\u0142ug za pomoc\u0105 jednolitej autoryzacji.<\/li>\n<li>W przypadku braku szeregu wymaganych atrybut\u00f3w w profilu u\u017cytkownik\u00f3w istnieje mo\u017cliwo\u015b\u0107 wzbogacenia danych, kt\u00f3re mog\u0105 by\u0107 dodane do \u0142adunku, w tym automatycznie i \"na bie\u017c\u0105co\".<\/li>\n<li>Nie ma potrzeby przechowywania informacji o aktywnych sesjach, aplikacja serwerowa musi jedynie sprawdzi\u0107 podpis.<\/li>\n<li>Bardziej elastyczne zarz\u0105dzanie dost\u0119pem dzi\u0119ki dodatkowym atrybutom w \u0142adunku.<\/li>\n<li>Zastosowanie podpisu tokena dla nag\u0142\u00f3wka i \u0142adunku zwi\u0119ksza bezpiecze\u0144stwo rozwi\u0105zania jako ca\u0142o\u015bci.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Token JWT \u2014 sk\u0142ada si\u0119 z<\/h3>\n<p>\n<b>Nag\u0142\u00f3wek<\/b> \u2014 domy\u015blnie nag\u0142\u00f3wek zawiera tylko typ tokena i algorytm u\u017cywany do szyfrowania.<\/p>\n<p>Typ tokena jest przechowywany w kluczu \"typ\". Klucz \"typ\" jest ignorowany w JWT. Je\u015bli klucz \"typ\" jest obecny, jego warto\u015b\u0107 powinna by\u0107 ustawiona na JWT, aby wskaza\u0107, \u017ce ten obiekt jest tokenem JSON Web.<\/p>\n<p>Drugi klucz \"alg\" okre\u015bla algorytm u\u017cywany do szyfrowania tokena. Domy\u015blnie powinien by\u0107 ustawiony na HS256. Nag\u0142\u00f3wek jest kodowany w base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>\u0141adunek (zawarto\u015b\u0107)<\/b> \u2014 w \u0142adunku przechowywane s\u0105 wszelkie informacje, kt\u00f3re musz\u0105 by\u0107 zweryfikowane. Ka\u017cdy klucz w \u0142adunku jest znany jako \u201eo\u015bwiadczenie\u201d. Na przyk\u0142ad, do aplikacji mo\u017cna si\u0119 zalogowa\u0107 tylko na zaproszenie (zamkni\u0119ta promocja). Kiedy chcemy zaprosi\u0107 kogo\u015b do udzia\u0142u, wysy\u0142amy mu e-mail z zaproszeniem. Wa\u017cne jest, aby sprawdzi\u0107, \u017ce adres e-mail nale\u017cy do osoby, kt\u00f3ra przyjmuje zaproszenie, dlatego umie\u015bcimy ten adres w \u0142adunku, zapisuj\u0105c go w kluczu \"e-mail\".<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nKlucze w \u0142adunku mog\u0105 by\u0107 dowolne. Niemniej jednak istnieje kilka zarezerwowanych:<\/p>\n<ul>\n<li>iss (Wydawca) \u2014 okre\u015bla aplikacj\u0119, z kt\u00f3rej wysy\u0142any jest token.<\/li>\n<li>sub (Temat) \u2014 definiuje temat tokenu.<\/li>\n<li>aud (Odbiorca) \u2013 tablica wra\u017cliwych na wielko\u015b\u0107 liter ci\u0105g\u00f3w lub URI, stanowi\u0105ca list\u0119 odbiorc\u00f3w tego tokenu. Kiedy strona odbieraj\u0105ca otrzymuje JWT z tym kluczem, musi sprawdzi\u0107 swoj\u0105 obecno\u015b\u0107 w tym zbiorze \u2014 w przeciwnym razie zignoruje token.<\/li>\n<li>exp (Czas wyga\u015bni\u0119cia) \u2014 wskazuje, kiedy token traci wa\u017cno\u015b\u0107. Standard JWT wymaga, aby we wszystkich jego implementacjach tokeny, kt\u00f3rych wa\u017cno\u015b\u0107 wygas\u0142a, by\u0142y odrzucane. Klucz Exp powinien by\u0107 znacznikiem czasu w formacie unix.<\/li>\n<li>nbf (Nie wcze\u015bniej ni\u017c) \u2014 to czas w formacie unix, definiuj\u0105cy moment, w kt\u00f3rym token stanie si\u0119 wa\u017cny.<\/li>\n<li>iat (Data wydania) \u2014 ten klucz reprezentuje czas, kiedy token zosta\u0142 wydany i mo\u017ce by\u0107 u\u017cyty do okre\u015blenia wieku JWT. Klucz iat powinien by\u0107 znacznikiem czasu w formacie unix.<\/li>\n<li>Jti (ID JWT) \u2014 ci\u0105g, kt\u00f3ry definiuje unikalny identyfikator danego tokenu z uwzgl\u0119dnieniem wielko\u015bci liter.<\/li>\n<\/ul>\n<p>\nWa\u017cne jest, aby zrozumie\u0107, \u017ce \u0142adunek u\u017cytkowy nie jest przesy\u0142any w formie zaszyfrowanej (chocia\u017c tokeny mog\u0105 by\u0107 zagnie\u017cd\u017cone i wtedy mo\u017cna przesy\u0142a\u0107 zaszyfrowane dane). Dlatego nie nale\u017cy w nim przechowywa\u0107 \u017cadnych informacji poufnych. Podobnie jak nag\u0142\u00f3wek, \u0142adunek kodowany jest w base64.<br \/>\n<b>Podpis<\/b> \u2014 gdy mamy nag\u0142\u00f3wek i \u0142adunek, mo\u017cemy obliczy\u0107 podpis.<\/p>\n<p>Wykorzystywane s\u0105 zakodowane w base64: nag\u0142\u00f3wek i \u0142adunek, \u0142\u0105czone w ci\u0105g za pomoc\u0105 kropki. Nast\u0119pnie ten ci\u0105g i tajny klucz s\u0105 podawane do algorytmu szyfrowania, wskazanego w nag\u0142\u00f3wku (klucz \u201ealg\u201d). Klucz mo\u017ce by\u0107 dowolnym ci\u0105giem. D\u0142u\u017csze ci\u0105gi b\u0119d\u0105 bardziej preferowane, poniewa\u017c wymagaj\u0105 wi\u0119cej czasu na odgadni\u0119cie.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Budowa architektury odpornego na awarie klastra Keycloak<\/h3>\n<p>\nPrzy u\u017cywaniu jednego klastra dla wszystkich projekt\u00f3w rosn\u0105 wymagania dotycz\u0105ce rozwi\u0105zania SSO. Gdy liczba projekt\u00f3w jest niewielka, wymagania te nie s\u0105 tak odczuwalne dla wszystkich projekt\u00f3w, jednak w miar\u0119 wzrostu liczby u\u017cytkownik\u00f3w i integracji rosn\u0105 wymagania dotycz\u0105ce dost\u0119pno\u015bci i wydajno\u015bci. <\/p>\n<p>Zwi\u0119kszone ryzyko awarii jednego punktu SSO podnosi wymagania dotycz\u0105ce architektury rozwi\u0105zania oraz metod rezerwacji komponent\u00f3w, co prowadzi do bardzo restrykcyjnych SLA. W zwi\u0105zku z tym, w trakcie projektowania lub wczesnych etap\u00f3w wdra\u017cania rozwi\u0105za\u0144, projekty cz\u0119sto maj\u0105 w\u0142asn\u0105, nienaawaryjn\u0105 infrastruktur\u0119. W miar\u0119 rozwoju konieczne jest uwzgl\u0119dnienie mo\u017cliwo\u015bci rozwoju i skalowania. Najbardziej elastycznym rozwi\u0105zaniem do budowy odpornego klastra jest zastosowanie wirtualizacji kontenerowej lub podej\u015bcia hybrydowego. <\/p>\n<p>Aby dzia\u0142a\u0107 w trybie Active\/Active i Active\/Passive klastra, nale\u017cy zapewni\u0107 sp\u00f3jno\u015b\u0107 danych w relacyjnej bazie danych \u2014 oba w\u0119z\u0142y bazy danych musz\u0105 by\u0107 synchronizowane mi\u0119dzy r\u00f3\u017cnymi geograficznie rozproszonymi centrami danych.<\/p>\n<p>Najprostszy przyk\u0142ad instalacji odpornej na awarie.<\/p>\n<p><img decoding=\"async\" alt=\"SSO w architekturze mikrous\u0142ug. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJakie korzy\u015bci daje wykorzystanie jednego klastra:<\/p>\n<ul>\n<li>Wysoka dost\u0119pno\u015b\u0107 i wydajno\u015b\u0107.<\/li>\n<li>Wsparcie tryb\u00f3w pracy: Active\/Active, Active\/Passive.<\/li>\n<li>Mo\u017cliwo\u015b\u0107 dynamicznego skalowania \u2014 przy zastosowaniu wirtualizacji kontenerowej.<\/li>\n<li>Mo\u017cliwo\u015b\u0107 centralnego zarz\u0105dzania i monitorowania.<\/li>\n<li>Jednolity approach do identyfikacji\/uwierzytelniania\/autoryzacji u\u017cytkownik\u00f3w w projektach.<\/li>\n<li>Bardziej przezroczysta wsp\u00f3\u0142praca mi\u0119dzy r\u00f3\u017cnymi projektami bez zaanga\u017cowania u\u017cytkownik\u00f3w.<\/li>\n<li>Mo\u017cliwo\u015b\u0107 ponownego wykorzystania tokena JWT w r\u00f3\u017cnych projektach.<\/li>\n<li>Jednolity punkt zaufania.<\/li>\n<li>Szybsze uruchamianie projekt\u00f3w z u\u017cyciem mikroserwis\u00f3w\/wirtualizacji kontenerowej (nie jest wymagane uruchamianie i konfiguracja dodatkowych komponent\u00f3w).<\/li>\n<li>Mo\u017cliwo\u015b\u0107 zakupu wsparcia komercyjnego od dostawcy. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Na co zwr\u00f3ci\u0107 uwag\u0119 przy planowaniu klastra<\/h3>\n<p><\/p>\n<h4>DBMS<\/h4>\n<p>\nKeycloak wykorzystuje system zarz\u0105dzania DBMS do przechowywania: realms, clients, users itp.<br \/>\nWspiera szeroki zakres DBMS: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak jest dostarczany z w\u0142asn\u0105 wbudowan\u0105 relacyjn\u0105 baz\u0105 danych. Zaleca si\u0119 u\u017cycie w \u015brodowiskach o niskim obci\u0105\u017ceniu \u2013 takich jak \u015brodowiska deweloperskie.<\/p>\n<p>Aby dzia\u0142a\u0107 w trybie Active\/Active i Active\/Passive klastra, nale\u017cy zapewni\u0107 sp\u00f3jno\u015b\u0107 danych w relacyjnej bazie danych, a oba w\u0119z\u0142y klastra baz danych synchronizuj\u0105 si\u0119 mi\u0119dzy centrami danych.<\/p>\n<h4>Rozproszona pami\u0119\u0107 podr\u0119czna (Infinspan)<\/h4>\n<p>\nAby klaster dzia\u0142a\u0142 poprawnie, wymagana jest dodatkowa synchronizacja nast\u0119puj\u0105cych typ\u00f3w pami\u0119ci podr\u0119cznej z u\u017cyciem JBoss Data Grid:<\/p>\n<p>Sesje uwierzytelniania \u2014 u\u017cywane do przechowywania danych podczas uwierzytelniania konkretnego u\u017cytkownika. \u017b\u0105dania z tej pami\u0119ci podr\u0119cznej zazwyczaj obejmuj\u0105 tylko przegl\u0105dark\u0119 i serwer Keycloak, a nie aplikacj\u0119.<\/p>\n<p>Tokeny akcji \u2014 stosowane w scenariuszach, w kt\u00f3rych u\u017cytkownik musi potwierdzi\u0107 dzia\u0142anie asynchronicznie (za po\u015brednictwem poczty elektronicznej). Na przyk\u0142ad w trakcie procesu zapomnienia has\u0142a pami\u0119\u0107 podr\u0119czna actionTokens Infinispan jest u\u017cywana do \u015bledzenia metadanych dotycz\u0105cych powi\u0105zanych znacznik\u00f3w akcji, kt\u00f3re zosta\u0142y ju\u017c wykorzystane, dlatego nie mo\u017cna ich u\u017cy\u0107 ponownie.<\/p>\n<p>Pami\u0119\u0107 podr\u0119czna i uniewa\u017cnienie danych trwa\u0142ych \u2013 u\u017cywane do buforowania trwa\u0142ych danych, aby unikn\u0105\u0107 zb\u0119dnych zapyta\u0144 do bazy danych. Kiedy jakikolwiek serwer Keycloak aktualizuje dane, wszystkie pozosta\u0142e serwery Keycloak we wszystkich centrach danych musz\u0105 o tym wiedzie\u0107.<\/p>\n<p>Praca \u2014 u\u017cywana tylko do przesy\u0142ania wiadomo\u015bci o uniewa\u017cnieniu mi\u0119dzy w\u0119z\u0142ami klastra a centrami danych. <\/p>\n<p>Sesje u\u017cytkownik\u00f3w \u2014 u\u017cywane do przechowywania danych o sesjach u\u017cytkownika, kt\u00f3re s\u0105 wa\u017cne w trakcie trwania sesji przegl\u0105darki u\u017cytkownika. Pami\u0119\u0107 podr\u0119czna musi obs\u0142ugiwa\u0107 \u017c\u0105dania HTTP od ko\u0144cowego u\u017cytkownika i aplikacji. <\/p>\n<p>Ochrona przed atakami typu brute force \u2014 u\u017cywana do \u015bledzenia danych o nieudanych pr\u00f3bach logowania. <\/p>\n<h4>Rozk\u0142ad obci\u0105\u017cenia<\/h4>\n<p>\nSerwer r\u00f3wnowa\u017cenia obci\u0105\u017cenia jest jedynym punktem dost\u0119pu do Keycloak i musi obs\u0142ugiwa\u0107 sesje sticky. <\/p>\n<h4>Serwery aplikacji<\/h4>\n<p>\nU\u017cywane do kontrolowania interakcji mi\u0119dzy komponentami i mog\u0105 by\u0107 wirtualizowane lub konteneryzowane z u\u017cyciem istniej\u0105cych narz\u0119dzi automatyzacji i dynamicznego skalowania infrastruktury. Najcz\u0119stsze scenariusze wdro\u017cenia w OpenShift, Kubernetes, Rancher.<\/p>\n<p>To koniec pierwszej cz\u0119\u015bci \u2013 teoretycznej. W kolejnych cyklach artyku\u0142\u00f3w b\u0119d\u0105 omawiane przyk\u0142ady integracji z r\u00f3\u017cnymi dostawcami to\u017csamo\u015bci oraz przyk\u0142ady konfiguracji.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/486778\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Single-Sing-On (SSO). \u041d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u043a\u0430\u043a AD \u0438\u043b\u0438 \u0438\u043d\u044b\u0435, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SSO w architekturze mikrous\u0142ugowej. U\u017cywamy Keycloak. Cz\u0119\u015b\u0107 nr 1 | ProHoster","description":"W ka\u017cdej du\u017cej firmie, a X5 Retail Group nie jest wyj\u0105tkiem, w miar\u0119 rozwoju ro\u015bnie liczba projekt\u00f3w, w kt\u00f3rych wymagana jest autoryzacja u\u017cytkownik\u00f3w.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster","og:description":"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.","og:url":"https:\/\/prohoster.info\/pl\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T07:07:04+00:00","article:modified_time":"2020-02-05T07:07:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40865","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:46:14","updated":"2022-09-27 14:28:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}