{"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\/hr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>U svakoj velikoj kompaniji, pa tako i u X5 Retail Group, s vremenom raste broj projekata koji tra\u017ee autorizaciju korisnika. Kako vrijeme prolazi, potrebno je osigurati nesmetan prijelaz korisnika iz jedne aplikacije u drugu, \u0161to stvara potrebu za kori\u0161tenjem jedinstvenog poslu\u017eitelja za prijavu jednim klikom (Single-Sign-On, SSO). No, \u0161to u\u010diniti kada su identifikacijski pru\u017eatelji poput AD-a ili drugih, koji nemaju dodatne atribute, ve\u0107 kori\u0161teni u razli\u010ditim projektima? U pomo\u0107 dolaze klase sustava poznate kao \u201eidentifikacijski posrednici\u201c. Najfunkcionalniji me\u0111u njima su oni poput Keycloak-a, Gravitee Access management i sl. Naj\u010de\u0161\u0107e upotrebe mogu biti razli\u010dite: strojna interakcija, sudjelovanje korisnika itd. Rje\u0161enje mora podr\u017eavati fleksibilnu i skalabilnu funkcionalnost koja mo\u017ee okupiti sve zahtjeve na jednom mjestu, a trenutno je to u na\u0161oj kompaniji identifikacijski posrednik \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161\" 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 je proizvod otvorenog izvora namijenjen identificiranju i kontroli pristupa, koji podr\u017eava tvrtka RedHat. On je osnova za proizvode tvrtke koji koriste SSO \u2013 RH-SSO.<\/p>\n<h3>Osnovni pojmovi <\/h3>\n<p>\nPrije nego \u0161to se po\u010dnete baviti rje\u0161enjima i pristupima, potrebno je definirati termine i slijed procesa:<\/p>\n<p><img decoding=\"async\" alt=\"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identifikacija<\/b> \u2014 to je procedura prepoznavanja subjekta po njegovom identifikatoru (jednostavnim rije\u010dima, to je odre\u0111ivanje imena, korisni\u010dkog imena ili broja).<\/p>\n<p><b>Autentifikacija<\/b> \u2013 to je procedura provjere autenti\u010dnosti (korisnika se provjerava pomo\u0107u lozinke, e-mail se provjerava putem elektroni\u010dkog potpisa itd.)<\/p>\n<p><b>Autorizacija<\/b> \u2013 to je omogu\u0107avanje pristupa nekom resursu (na primjer, elektroni\u010dkoj po\u0161ti).<\/p>\n<h4>Identifikacijski posrednik Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 to je rje\u0161enje za upravljanje identifikacijom i pristupom s otvorenim izvorom, namijenjeno kori\u0161tenju u informacijskim sustavima gdje se mogu koristiti obrasci mikroservisne arhitekture.<\/p>\n<p>Keycloak nudi takve funkcije kao \u0161to su jedinstvena prijava (SSO), posredni\u010dka identifikacija i dru\u0161tvena prijava u sustav, federacija korisnika, klijentski adapteri, konzola za administraciju i konzola za upravljanje ra\u010dunima.<\/p>\n<p>Osnovna funkcionalnost koju podr\u017eava Keycloak:<\/p>\n<ul>\n<li>Jedinstvena prijava i jedinstveno odjavljivanje za web aplikacije.<\/li>\n<li>Podr\u0161ka za OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identitetsko posredovanje \u2013 autentifikacija putem vanjskih OpenID Connect ili SAML identitetskih provajdera.<\/li>\n<li>Dru\u0161tvena prijava \u2013 podr\u0161ka za Google, GitHub, Facebook, Twitter za identifikaciju korisnika.<\/li>\n<li>Federacija korisnika \u2013 sinhronizacija korisnika iz LDAP i Active Directory servera i drugih identitetskih provajdera.<\/li>\n<li>Kerberos most \u2013 kori\u0161\u0107enje Kerberos servera za automatsku autentifikaciju korisnika.<\/li>\n<li>Administratorska konzola \u2014 za centralizovano upravljanje postavkama i parametrima re\u0161enja putem Web-a.<\/li>\n<li>Konzola za upravljanje korisni\u010dkim ra\u010dunima \u2013 za samostalno upravljanje korisni\u010dkim profilima.<\/li>\n<li>Kustomizacija re\u0161enja u skladu sa brendom kompanije.<\/li>\n<li>2FA autentifikacija \u2013 podr\u0161ka za TOTP\/HOTP putem Google Authenticator ili FreeOTP.<\/li>\n<li>Tokovi prijave \u2013 mogu\u0107e samoregistracija korisnika, obnova i resetovanje lozinki i druge opcije.<\/li>\n<li>Upravljanje sesijama \u2013 administratori mogu upravljati sesijama korisnika iz jedinstvene ta\u010dke.<\/li>\n<li>Mapperi tokena \u2013 povezivanje atributa korisnika, uloga i drugih potrebnih atributa u tokene.<\/li>\n<li>Fleksibilno upravljanje politikama putem realm, aplikacija i korisnika.<\/li>\n<li>CORS podr\u0161ka \u2013 klijentski adapteri imaju ugra\u0111enu podr\u0161ku za CORS.<\/li>\n<li>Interfejsi provajdera usluga (SPI) \u2013 veliki broj SPI-a koji omogu\u0107avaju pode\u0161avanje razli\u010ditih aspekata rada servera: tokovi autentifikacije, identitetski provajderi, mapiranje protokola i mnogo vi\u0161e.<\/li>\n<li>Klijentski adapteri za JavaScript aplikacije, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Podr\u0161ka za rad sa razli\u010ditim aplikacijama koje podr\u017eavaju OpenID Connect Relying Party biblioteku ili SAML 2.0 biblioteka provajdera usluga.<\/li>\n<li>Mogu\u0107nost pro\u0161irenja putem dodataka.<\/li>\n<\/ul>\n<p>\nZa CI\/CD procese, kao i automatizaciju procesa upravljanja u Keycloak, mo\u017ee se koristiti REST API\/JAVA API. Dokumentacija je dostupna u elektronskom formatu: <\/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>Identitetski provajderi na nivou preduze\u0107a (On-Premise)<\/h4>\n<p>\nMogu\u0107nost autentifikacije korisnika putem User Federation usluga.<\/p>\n<p><img decoding=\"async\" alt=\"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTako\u0111e mo\u017ee biti kori\u0161\u0107ena prolazna autentifikacija \u2013 ako se korisnici autentifikuju na radnim stanicama sa Kerberos (LDAP ili AD), mogu biti automatski autentifikovani na Keycloak bez potrebe da ponovo unose svoje korisni\u010dko ime i lozinku. <\/p>\n<p>Za autentifikaciju i daljnju autorizaciju korisnika mogu\u0107e je koristiti relacijsku bazu podataka, \u0161to je najprimjerenije za razvojne sredine jer ne zahtijeva dugotrajna pode\u0161avanja i integracije u ranim fazama projekata. Po defaultu, Keycloak koristi ugra\u0111enu bazu podataka za pohranu postavki i podataka o korisnicima.<\/p>\n<p>Popis podr\u017eanih baza podataka je \u0161irok i uklju\u010duje: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle i druge. Najtestiraniji su trenutno Oracle 12C Release1 RAC i Galera 3.12 cluster za MariaDB 10.1.19. <\/p>\n<h4>Identifikacijski pru\u017eatelji \u2013 social login <\/h4>\n<p>\nMogu\u0107e je koristiti prijavu iz dru\u0161tvenih mre\u017ea. Za aktivaciju mogu\u0107nosti autentikacije korisnika koristi se administratorska konzola Keycloak. Nema potrebe za promjenama u kodu aplikacija, a ova funkcionalnost je dostupna \u201eiz kutije\u201c i mo\u017ee se aktivirati u bilo kojoj fazi realizacije projekta.<\/p>\n<p><img decoding=\"async\" alt=\"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZa autentifikaciju korisnika mogu\u0107e je koristiti OpenID\/SAML identitetske pru\u017eatelje.<\/p>\n<h3>Tipi\u010dni scenariji autorizacije s kori\u0161tenjem OAuth2 u Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2013 koristi se sa servernim aplikacijama (server-side applications). Jedan od naj\u010de\u0161\u0107e kori\u0161tenih tipova auth autorizacije, jer je dobro prilago\u0111en za serverne aplikacije gdje izvorni kod aplikacije i podaci klijenta nisu dostupni tre\u0107im stranama. Proces se u ovom slu\u010daju temelji na preusmjeravanju (redirection). Aplikacija mora biti sposobna interagirati s korisni\u010dkim agentom (user-agent), kao \u0161to je web preglednik \u2013 primati kodove autorizacije API preusmjerene putem korisni\u010dkog agenta.<\/p>\n<p><b>Implicit Flow<\/b> \u2013 koristi se u mobilnim ili web aplikacijama (aplikacije koje rade na ure\u0111aju korisnika).<\/p>\n<p>Neizraziti tip odobrenja koristi se u mobilnim i web aplikacijama gdje se privatnost korisnika ne mo\u017ee garantirati. Neizraziti tip odobrenja tako\u0111er koristi preusmjeravanje korisni\u010dkog agenta, pri \u010demu se pristupni token predaje korisni\u010dkom agentu za daljnju upotrebu u aplikaciji. To \u010dini token dostupnim korisniku i drugim aplikacijama na korisnikovom ure\u0111aju. Ovaj tip odobrenja ne provodi autentifikaciju aplikacije, a cijeli proces oslanja se na URL preusmjeravanja (registriran ranije u servisu).<\/p>\n<p>Neizraziti tok ne podr\u017eava osvje\u017eavanje pristupnog tokena (refresh tokens).<br \/>\n<br \/>\n<b>Grant tok za klijentske vjerodajnice<\/b> \u2014 koristi se kada aplikacija pristupa API-ju. Ovaj tip odobrenja obi\u010dno se koristi za 'poslu\u017eitelj-za-poslu\u017eitelj' interakcije, koje se moraju izvoditi u pozadini bez neposredne interakcije s korisnikom. Tok davanja klijentskih vjerodajnica omogu\u0107uje web usluzi (povjerljivom klijentu) kori\u0161tenje vlastitih vjerodajnica umjesto identifikacije korisnika za autentifikaciju prilikom poziva druge web usluge. Za vi\u0161i nivo sigurnosti, pozivateljska usluga mo\u017ee koristiti certifikat (umjesto zajedni\u010dkog tajnog klju\u010da) kao vjerodajnicu.<\/p>\n<p>OAuth2 specifikacija opisana je u <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>JWT token i njegove prednosti<\/h3>\n<p>\nJWT (JSON Web Token) \u2014 otvoreni standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), koji definira kompaktan i samostalan na\u010din za sigurnu razmjenu informacija izme\u0111u strana u obliku JSON objekta.<\/p>\n<p>Prema standardu, token se sastoji od tri dijela u base-64 formatu, odvojena to\u010dkama. Prvi dio se zove zaglavlje (header), koje sadr\u017ei tip tokena i naziv hash algoritma za generiranje digitalnog potpisa. Drugi dio sadr\u017ei osnovne informacije (korisnik, atributi itd.). Tre\u0107i dio \u2013 digitalni potpis.<\/p>\n<p>..<br \/>\nNikada ne pohranjujte token u va\u0161u BDP. Zato \u0161to je va\u017ee\u0107i token ekvivalentan lozinci, pohranjivanje tokena je isto kao pohranjivanje lozinke u otvorenom obliku.<br \/>\n<b>Access-token <\/b>\u2014 je token koji svom vlasniku omogu\u0107uje pristup za\u0161ti\u0107enim resursima servera. Obi\u010dno ima kratak rok trajanja i mo\u017ee sadr\u017eavati dodatne informacije, kao \u0161to je IP adresa strane koja zahtijeva taj token.<\/p>\n<p><b>Refresh token <\/b>\u2014 je token koji klijentima omogu\u0107uje da zatra\u017ee nove access tokene nakon \u0161to im istekne rok trajanja. Ovi tokeni se obi\u010dno dodjeljuju na du\u017ei rok.<\/p>\n<p>Glavne prednosti upotrebe u mikroservisnoj arhitekturi:<\/p>\n<ul>\n<li>Mogu\u0107nost pristupa razli\u010ditim aplikacijama i uslugama putem jedinstvene autentifikacije.<\/li>\n<li>U slu\u010daju nedostatka odre\u0111enih potrebnih atributa u korisni\u010dkim profilima mogu\u0107e je obogatiti podatke koji se mogu dodati u korisni teret, uklju\u010duju\u0107i automatski i \"u hodu\".<\/li>\n<li>Nema potrebe za pohranjivanjem informacija o aktivnim sesijama, serverska aplikacija samo treba provjeriti potpis.<\/li>\n<li>Fleksibilnije upravljanje pristupom zahvaljuju\u0107i dodatnim atributima u korisnom teretu.<\/li>\n<li>Primjena potpisa tokena za zaglavlje i korisni teret pove\u0107ava sigurnost rje\u0161enja u cjelini.<\/li>\n<\/ul>\n<p><\/p>\n<h3>JWT token \u2014 sastav<\/h3>\n<p>\n<b>Zaglavlje<\/b> \u2014 po defaultu, zaglavlje sadr\u017ei samo tip tokena i algoritam koji se koristi za \u0161ifriranje.<\/p>\n<p>Tip tokena se pohranjuje u klju\u010du \"typ\". Klju\u010d \"typ\" se ignorira u JWT-u. Ako klju\u010d \"typ\" postoji, njegova vrijednost mora biti JWT, kako bi se nazna\u010dilo da je ovaj objekt JSON Web Token.<\/p>\n<p>Drugi klju\u010d \"alg\" odre\u0111uje algoritam koji se koristi za \u0161ifriranje tokena. Po defaultu bi trebao biti postavljen na HS256. Zaglavlje se kodira u base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Payload (sadr\u017eaj)<\/b> \u2014 u korisnom teretu se pohranjuje svaka informacija koja se treba provjeriti. Svaki klju\u010d u korisnom teretu poznat je kao \"izjava\". Na primjer, u aplikaciju je mogu\u0107e u\u0107i samo po pozivu (zatvoren promocijski doga\u0111aj). Kada \u017eelimo pozvati nekoga da sudjeluje, \u0161aljemo mu e-mail s pozivom. Va\u017eno je provjeriti da e-mail adresa pripada osobi koja prihva\u0107a poziv, stoga \u0107emo uklju\u010diti tu adresu u korisni teret, \u010duvaju\u0107i je u klju\u010du \"e-mail\".<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nKlju\u010devi u payload-u mogu biti proizvoljni. Me\u0111utim, postoji nekoliko rezerviranih:<\/p>\n<ul>\n<li>iss (Issuer) \u2014 definira aplikaciju iz koje se \u0161alje token.<\/li>\n<li>sub (Tema) \u2014 definira predmet tokena.<\/li>\n<li>aud (Publika) \u2013 niz osjetljivih na velika\/mala slova ili URI, koji je popis primatelja ovog tokena. Kada primatelj primi JWT s ovom klju\u010dem, mora provjeriti svoju prisutnost me\u0111u primateljima \u2014 ina\u010de treba ignorirati token.<\/li>\n<li>exp (Vrijeme isteka) \u2014 ozna\u010dava kada isti\u010de valjanost markera. Standard JWT zahtijeva da se svi njegovi umno\u017eivi odbijaju kada im istekne valjanost. Klju\u010d exp mora biti vremenska oznaka u unix formatu.<\/li>\n<li>nbf (Ne prije) \u2014 ovo je vrijeme u unix formatu koje odre\u0111uje trenutak kada token postaje valjan.<\/li>\n<li>iat (Izdano u) \u2014 ovaj klju\u010d predstavlja vrijeme kada je token izdan i mo\u017ee se koristiti za odre\u0111ivanje starosti JWT-a. Klju\u010d iat mora biti vremenska oznaka u unix formatu.<\/li>\n<li>Jti (JWT ID) \u2014 niz koji definira jedinstveni identifikator ovog tokena uzimaju\u0107i u obzir velika i mala slova.<\/li>\n<\/ul>\n<p>\nVa\u017eno je razumjeti da se korisni podaci ne prenose u \u0161ifriranom obliku (iako, tokeni mogu biti ugnije\u017edeni i tada je mogu\u0107e prenositi \u0161ifrirane podatke). Stoga se u njima ne smije pohranjivati nikakve tajne informacije. Kao i zaglavlje, korisni podaci se kodiraju u base64.<br \/>\n<b>Potpis<\/b> \u2014 kada imamo zaglavlje i korisne podatke, mo\u017eemo izra\u010dunati potpis.<\/p>\n<p>Uzimaju se kodirani u base64: zaglavlje i korisni podaci, oni se spajaju u niz kroz to\u010dku. Tada se ovaj niz i tajni klju\u010d \u0161alju algoritmu \u0161ifriranja navedenom u zaglavlju (klju\u010d \u201ealg\u201c). Klju\u010d mo\u017ee biti bilo koja niz. Du\u017ei nizovi bit \u0107e najpo\u017eeljniji, jer \u0107e trebati vi\u0161e vremena za pronala\u017eenje.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Izrada arhitekture otpornog klastera Keycloak<\/h3>\n<p>\nKada se koristi jedan klaster za sve projekte, zahtjevi za SSO rje\u0161enjem postaju ve\u0107i. Kada je broj projekata mali, ti zahtjevi nisu toliko osjetni za sve projekte, me\u0111utim, s pove\u0107anjem broja korisnika i integracija, raste potreba za dostupno\u0161\u0107u i performansama. <\/p>\n<p>Pove\u0107anje rizika od neuspjeha jedinstvenog SSO-a pove\u0107ava zahtjeve za arhitekturu rje\u0161enja i kori\u0161tene metode rezerviranja komponenti te dovodi do vrlo strogog SLA-a. U vezi s tim, projekti \u010desto imaju vlastitu infrastrukturu koja nije otporna na neuspjehe tijekom razvoja ili ranih faza implementacije rje\u0161enja. Kako se razvijaju, potrebna su rje\u0161enja koja omogu\u0107uju rast i skalabilnost. Najflexibilnije je izgraditi otporniji klaster koriste\u0107i kontejnersku virtualizaciju ili hibridni pristup. <\/p>\n<p>Za rad u na\u010dinu Active\/Active i Active\/Passive klastera potrebno je osigurati dosljednost podataka u relacijskoj bazi podataka - oba \u010dvora baze podataka moraju biti sinkrono replikovana me\u0111u razli\u010ditim geografski distribuiranim podatkovnim centrima.<\/p>\n<p>Najjednostavniji primjer otpornog instaliranja.<\/p>\n<p><img decoding=\"async\" alt=\"SSO na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKoje prednosti donosi kori\u0161tenje jedinstvenog klastera:<\/p>\n<ul>\n<li>Visoka dostupnost i performanse.<\/li>\n<li>Podr\u0161ka za na\u010dine rada: Active\/Active, Active\/Passive.<\/li>\n<li>Mogu\u0107nost dinami\u010dkog skaliranja - pri kori\u0161tenju kontejnerske virtualizacije.<\/li>\n<li>Mogu\u0107nost centraliziranog upravljanja i nadzora.<\/li>\n<li>Jedinstveni pristup za identifikaciju\/ autentifikaciju\/ autorizaciju korisnika u projektima.<\/li>\n<li>Prozirnija interakcija izme\u0111u razli\u010ditih projekata bez uklju\u010divanja korisnika.<\/li>\n<li>Mogu\u0107nost ponovnog kori\u0161tenja JWT tokena u razli\u010ditim projektima.<\/li>\n<li>Jedinstvena to\u010dka povjerenja.<\/li>\n<li>Br\u017ei po\u010detak projekata kori\u0161tenjem mikroservisa\/ kontejnerske virtualizacije (nije potrebno pokretati i postavljati dodatne komponente).<\/li>\n<li>Postoji mogu\u0107nost kupnje komercijalne podr\u0161ke od dobavlja\u010da. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Na \u0161to treba obratiti pa\u017enju pri planiranju klastera<\/h3>\n<p><\/p>\n<h4>DBMS<\/h4>\n<p>\nKeycloak koristi sustav upravljanja DBMS-om za pohranu: realms, clients, users itd.<br \/>\nPodr\u017eava \u0161irok spektar DBMS-a: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak dolazi s vlastitom ugra\u0111enom relacijskom bazom podataka. Preporu\u010duje se kori\u0161tenje za nenapu\u010dena okru\u017eenja - poput razvojnih okru\u017eenja.<\/p>\n<p>Za rad u na\u010dinu Active\/Active i Active\/Passive klastera potrebno je osigurati dosljednost podataka u relacijskoj bazi podataka, a oba \u010dvora klastera baza podataka sinkrono se replikiraju me\u0111u podatkovnim centrima.<\/p>\n<h4>Distribuirani cache (Infinspan)<\/h4>\n<p>\nZa ispravan rad klastera potrebna je dodatna sinkronizacija sljede\u0107ih vrsta ke\u0161a uz JBoss Data Grid:<\/p>\n<p>Sesije autentifikacije \u2014 koriste se za pohranu podataka prilikom autentifikacije odre\u0111enog korisnika. Upiti iz ovog ke\u0161a obi\u010dno uklju\u010duju samo preglednik i Keycloak server, a ne aplikaciju.<\/p>\n<p>Akcijski tokeni \u2014 koriste se za scenarije kada korisnik treba potvrditi akciju asinkrono (putem e-po\u0161te). Na primjer, tijekom tokova zaboravljene lozinke, ke\u0161 akcijskih tokena Infinispan koristi se za pra\u0107enje metapodataka o povezanih markerima akcija koji su ve\u0107 kori\u0161teni, stoga se ne mogu ponovo koristiti.<\/p>\n<p>Ke\u0161iranje i povla\u010denje trajnih podataka \u2013 koristi se za ke\u0161iranje trajnih podataka kako bi se izbjegli nepotrebni upiti prema bazi podataka. Kada neki Keycloak server a\u017eurira podatke, svi ostali Keycloak serveri u svim centrima podataka moraju biti svjesni toga.<\/p>\n<p>Rad \u2014 koristi se samo za slanje poruka o neva\u017eenju izme\u0111u \u010dvorova klastera i centara podataka. <\/p>\n<p>Korisni\u010dke sesije \u2014 koriste se za pohranu podataka o korisni\u010dkim sesijama koje su valjane tijekom sesije preglednika korisnika. Ke\u0161 mora obraditi HTTP zahtjeve od krajnjeg korisnika i aplikacije. <\/p>\n<p>Za\u0161tita od brute force napada \u2014 koristi se za pra\u0107enje podataka o neuspje\u0161nim prijavama. <\/p>\n<h4>Upravljanje optere\u0107enjem<\/h4>\n<p>\nUpravlja\u010dka jedinica optere\u0107enja je jedinstvena to\u010dka ulaza u Keycloak i mora podr\u017eavati sticky sesije. <\/p>\n<h4>Serverske aplikacije<\/h4>\n<p>\nKoriste se za kontrolu interakcije izme\u0111u komponenti i mogu biti virtualizirane ili kontejnerizirane uz kori\u0161tenje postoje\u0107ih alata za automatizaciju i dinami\u010dko skaliranje infrastrukture. Naj\u010de\u0161\u0107i scenariji implementacije u OpenShift, Kubernetes, Rancher.<\/p>\n<p>Ovdje prva dio \u2014 teoretski \u2014 zavr\u0161ava. U sljede\u0107im ciklusima \u010dlanaka bit \u0107e razmatrani primjeri integracija s razli\u010ditim pru\u017eateljima identiteta i primjeri postavki.<br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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 na mikroservisnoj arhitekturi. Koristimo Keycloak. Dio \u21161 | ProHoster","description":"U svakoj velikoj kompaniji, a X5 Retail Group nije izuzetak, kako se razvijaju, raste broj projekata gdje je potrebna autorizacija korisnika.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}