{"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\/it\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In ogni grande azienda, e X5 Retail Group non fa eccezione, con lo sviluppo aumenta il numero di progetti dove \u00e8 richiesta l'autenticazione degli utenti. Con il passare del tempo, diventa necessario un passaggio senza soluzione di continuit\u00e0 per gli utenti da un'applicazione all'altra e quindi si presenta la necessit\u00e0 di utilizzare un server unico di Single-Sign-On (SSO). Ma come fare quando provider di identificazione come AD o altri, che non possiedono attributi aggiuntivi, sono gi\u00e0 utilizzati in vari progetti. A soccorrerci arriva una classe di sistemi chiamata <\/p>\n<p><img decoding=\"async\" alt=\"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 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 \u00e8 un prodotto open source, progettato per l'autenticazione e il controllo degli accessi, supportato da RedHat. \u00c8 alla base dei prodotti della societ\u00e0 che utilizzano SSO \u2013 RH-SSO.<\/p>\n<h3>Concetti di base <\/h3>\n<p>\nPrima di iniziare a comprendere le soluzioni e gli approcci, \u00e8 necessario chiarire i termini e la sequenza dei processi:<\/p>\n<p><img decoding=\"async\" alt=\"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identificazione<\/b> \u2014 \u00e8 la procedura di riconoscimento di un soggetto tramite il suo identificatore (in altre parole, \u00e8 la determinazione del nome, login o numero).<\/p>\n<p><b>Autenticazione<\/b> \u2013 \u00e8 la procedura di autenticazione (l'utente viene verificato tramite password, la lettera viene verificata tramite firma elettronica, ecc.).<\/p>\n<p><b>Autenticazione<\/b> \u2013 \u00e8 la fornitura di accesso a una risorsa (ad esempio, alla posta elettronica).<\/p>\n<h4>Broker di identit\u00e0 Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 \u00e8 una soluzione per la gestione dell'identit\u00e0 e degli accessi open source, progettata per essere utilizzata in sistemi informativi dove possono essere utilizzati schemi di architettura a microservizi.<\/p>\n<p>Keycloak offre funzionalit\u00e0 come il single sign-on (SSO), l'identificazione broker e l'accesso sociale, la federazione degli utenti, adattatori del client, console di amministrazione e console di gestione degli account.<\/p>\n<p>Le funzionalit\u00e0 di base supportate in Keycloak:<\/p>\n<ul>\n<li>Single-Sign On e Single-Sign Out per applicazioni basate su browser.<\/li>\n<li>Supporto per OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identity Brokering \u2013 autenticazione tramite provider di identit\u00e0 esterni OpenID Connect o SAML.<\/li>\n<li>Social Login \u2013 supporto per Google, GitHub, Facebook, Twitter per l'identificazione degli utenti.<\/li>\n<li>User Federation \u2013 sincronizzazione degli utenti da server LDAP e Active Directory e altri provider di identit\u00e0.<\/li>\n<li>Kerberos bridge \u2013 uso del server Kerberos per l'autenticazione automatica degli utenti.<\/li>\n<li>Admin Console \u2014 per la gestione unificata delle impostazioni e delle configurazioni della soluzione tramite il Web.<\/li>\n<li>Account Management Console \u2013 per la gestione autonoma del profilo degli utenti.<\/li>\n<li>Personalizzazione della soluzione in base allo stile aziendale.<\/li>\n<li>2FA Authentication \u2013 supporto per TOTP\/HOTP tramite Google Authenticator o FreeOTP.<\/li>\n<li>Login Flows \u2013 \u00e8 possibile la registrazione autonoma degli utenti, il recupero e il ripristino della password e altro ancora.<\/li>\n<li>Session Management \u2013 gli amministratori possono gestire le sessioni degli utenti da un'unica posizione.<\/li>\n<li>Token Mappers \u2013 associazione degli attributi degli utenti, dei ruoli e di altri attributi richiesti nei token.<\/li>\n<li>Gestione flessibile delle politiche tramite realm, applicazioni e utenti.<\/li>\n<li>CORS Support \u2013 gli adattatori client hanno supporto CORS integrato.<\/li>\n<li>Service Provider Interfaces (SPI) \u2013 un gran numero di SPI che consentono di configurare vari aspetti del funzionamento del server: flussi di autenticazione, provider di identit\u00e0, mappatura dei protocolli e molto altro.<\/li>\n<li>Adattatori client per applicazioni JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Supporto per vari applicativi che utilizzano OpenID Connect Relying Party library o SAML 2.0 Service Provider Library.<\/li>\n<li>Possibilit\u00e0 di estensione tramite plugin.<\/li>\n<\/ul>\n<p>\nPer i processi CI\/CD, cos\u00ec come per l'automazione dei processi di gestione in Keycloak, \u00e8 possibile utilizzare REST API\/JAVA API. La documentazione \u00e8 disponibile in formato elettronico: <\/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>Provider di identit\u00e0 di livello aziendale (On-Premise)<\/h4>\n<p>\nPossibilit\u00e0 di autenticazione degli utenti tramite servizi di User Federation.<\/p>\n<p><img decoding=\"async\" alt=\"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c8 possibile utilizzare anche l'autenticazione trasversale: se gli utenti si autenticano su postazioni di lavoro con Kerberos (LDAP o AD), possono essere autenticati automaticamente su Keycloak senza la necessit\u00e0 di fornire nuovamente nome utente e password. <\/p>\n<p>Per l'autenticazione e la successiva autorizzazione degli utenti, \u00e8 possibile utilizzare un database relazionale, il che \u00e8 particolarmente utile per gli ambienti di sviluppo, in quanto non comporta lunghe configurazioni e integrazioni nelle fasi iniziali dei progetti. Per impostazione predefinita, Keycloak utilizza un database integrato per memorizzare le impostazioni e i dati sugli utenti.<\/p>\n<p>L'elenco dei database supportati \u00e8 ampio e include: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle e altri. Attualmente, i pi\u00f9 testati sono Oracle 12C Release1 RAC e Galera 3.12 cluster per MariaDB 10.1.19. <\/p>\n<h4>Provider di identit\u00e0 \u2014 accesso tramite social <\/h4>\n<p>\n\u00c8 possibile utilizzare le credenziali dei social media. Per attivare la possibilit\u00e0 di autenticare gli utenti, si utilizza la console di amministrazione di Keycloak. Non sono necessarie modifiche al codice delle applicazioni e questa funzionalit\u00e0 \u00e8 disponibile 'out of the box' e pu\u00f2 essere attivata in qualsiasi fase di implementazione del progetto.<\/p>\n<p><img decoding=\"async\" alt=\"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer l'autenticazione degli utenti \u00e8 possibile utilizzare provider di identit\u00e0 OpenID\/SAML.<\/p>\n<h3>Scenari tipici di autorizzazione usando OAuth2 in Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2014 utilizzato con applicazioni server-side. \u00c8 uno dei tipi pi\u00f9 comuni di autorizzazione, poich\u00e9 \u00e8 ben adatto per applicazioni server dove il codice sorgente dell'applicazione e i dati del client non sono accessibili da terzi. In questo caso, il processo si basa sulla redirezione. L'applicazione deve essere in grado di interagire con l'agent utente, come un browser web, per ricevere i codici di autorizzazione API reindirizzati attraverso l'agent utente.<\/p>\n<p><b>Implicit Flow<\/b> \u2014 utilizzato da applicazioni mobili o web (applicazioni che funzionano sul dispositivo dell'utente).<\/p>\n<p>Il tipo implicito di autorizzazione \u00e8 utilizzato da applicazioni mobili e web, dove la riservatezza del cliente non pu\u00f2 essere garantita. Il tipo implicito di autorizzazione utilizza anche il reindirizzamento dell'agente utente, con il token di accesso che viene passato all'agente utente per ulteriori utilizzi nell'applicazione. Questo rende il token disponibile per l'utente e per altre applicazioni sul dispositivo dell'utente. Con questo tipo di autorizzazione non viene eseguita l'autenticazione dell'applicazione, e l'intero processo si basa sull'URL di reindirizzamento (registrato in precedenza nel servizio).<\/p>\n<p>Il Flusso Implicito non supporta i token di aggiornamento del token di accesso (refresh tokens).<br \/>\n<br \/>\n<b>Flusso di concessione delle credenziali del client<\/b> \u2014 utilizzato quando un'applicazione accede a un'API. Questo tipo di autorizzazione \u00e8 generalmente impiegato per interazioni \"server-server\", che devono essere eseguite in background senza un'interazione immediata con l'utente. Il flusso di concessione delle credenziali del client consente a un servizio web (client riservato) di utilizzare le proprie credenziali invece della rappresentazione dell'utente per l'autenticazione quando chiama un altro servizio web. Per un livello di sicurezza maggiore, \u00e8 possibile che il servizio chiamante utilizzi un certificato (invece di un segreto condiviso) come credenziali.<\/p>\n<p>La specifica OAuth2 \u00e8 descritta in <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 e i suoi vantaggi<\/h3>\n<p>\nJWT (JSON Web Token) \u00e8 uno standard aperto (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), che definisce un modo compatto e autonomo per la trasmissione sicura di informazioni tra le parti sotto forma di oggetto JSON.<\/p>\n<p>Secondo lo standard, il token \u00e8 composto da tre parti in formato base-64, separate da punti. La prima parte \u00e8 chiamata intestazione (header), dove sono contenuti il tipo di token e il nome dell'algoritmo di hash per generare la firma digitale. La seconda parte contiene le informazioni principali (utente, attributi, ecc.). La terza parte \u00e8 la firma digitale.<\/p>\n<p>..<br \/>\nNon memorizzare mai il token nel tuo database. Perch\u00e9 un token valido \u00e8 equivalente a una password, memorizzare un token \u00e8 come memorizzare una password in chiaro.<br \/>\n<b>Token di accesso <\/b>\u2014 \u00e8 un token che fornisce al suo proprietario l'accesso a risorse protette del server. Di solito ha una vita breve e pu\u00f2 contenere informazioni aggiuntive, come l'indirizzo IP della parte che richiede questo token.<\/p>\n<p><b>Refresh-token <\/b>\u2014 \u00e8 un token che permette ai client di richiedere nuovi access-token al termine della loro vita utile. Questi token vengono generalmente emessi per un lungo periodo.<\/p>\n<p>I principali vantaggi dell'uso nell'architettura a microservizi:<\/p>\n<ul>\n<li>Possibilit\u00e0 di accesso a diverse applicazioni e servizi attraverso un'unica autenticazione.<\/li>\n<li>In assenza di alcuni attributi richiesti nel profilo utenti, \u00e8 possibile arricchirlo con dati che possono essere aggiunti al payload, anche in modo automatizzato e 'al volo'.<\/li>\n<li>Non \u00e8 necessario memorizzare informazioni sulle sessioni attive, l'applicazione server deve solo controllare la firma.<\/li>\n<li>Gestione dell'accesso pi\u00f9 flessibile grazie ad attributi aggiuntivi nel payload.<\/li>\n<li>L'uso della firma del token per l'intestazione e il payload aumenta la sicurezza della soluzione nel suo complesso.<\/li>\n<\/ul>\n<p><\/p>\n<h3>JWT token \u2014 composizione<\/h3>\n<p>\n<b>Titolo<\/b> \u2014 per impostazione predefinita, l'intestazione contiene solo il tipo di token e l'algoritmo utilizzato per la crittografia.<\/p>\n<p>Il tipo di token \u00e8 memorizzato nella chiave 'typ'. La chiave 'typ' \u00e8 ignorata nel JWT. Se la chiave 'typ' \u00e8 presente, il suo valore deve essere JWT, per indicare che questo oggetto \u00e8 un JSON Web Token.<\/p>\n<p>La seconda chiave 'alg' determina l'algoritmo utilizzato per crittografare il token. Per impostazione predefinita, deve essere impostato su HS256. L'intestazione \u00e8 codificata in base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Payload (contenuto)<\/b> \u2014 nel payload \u00e8 memorizzata qualsiasi informazione che deve essere verificata. Ogni chiave nel payload \u00e8 nota come 'dichiarazione'. Ad esempio, \u00e8 possibile accedere all'applicazione solo tramite invito (promozione chiusa). Quando vogliamo invitare qualcuno a partecipare, inviamo un'email con l'invito. \u00c8 importante verificare che l'indirizzo email appartenga alla persona che riceve l'invito, quindi includeremo questo indirizzo nel payload, conservandolo nella chiave 'e-mail'<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nLe chiavi nel payload possono essere arbitrarie. Tuttavia, ce ne sono alcune riservate:<\/p>\n<ul>\n<li>iss (Issuer) \u2014 definisce l'applicazione da cui viene inviato il token.<\/li>\n<li>sub (Soggetto) \u2014 definisce il tema del token.<\/li>\n<li>aud (Pubblico) \u2013 un array di stringhe sensibili al maiuscolo o URI, che costituisce un elenco dei destinatari di questo token. Quando il destinatario riceve il JWT con questa chiave, deve verificare di essere presente nell'elenco dei destinatari; in caso contrario, deve ignorare il token.<\/li>\n<li>exp (Tempo di scadenza) \u2014 indica quando scade la validit\u00e0 del token. Lo standard JWT richiede che in tutte le sue implementazioni i token scaduti vengano rifiutati. La chiave exp deve essere un timestamp in formato unix.<\/li>\n<li>nbf (Non prima di) \u2014 \u00e8 un'ora in formato unix che definisce il momento in cui il token diventa valido.<\/li>\n<li>iat (Data di emissione) \u2014 questa chiave rappresenta il momento in cui il token \u00e8 stato emesso e pu\u00f2 essere utilizzata per determinare l'et\u00e0 del JWT. La chiave iat deve essere un timestamp in formato unix.<\/li>\n<li>Jti (ID JWT) \u2014 una stringa che definisce un identificatore unico per questo token, considerando il maiuscolo.<\/li>\n<\/ul>\n<p>\n\u00c8 importante comprendere che il payload non viene trasmesso in forma crittografata (anche se i token possono essere annidati e quindi \u00e8 possibile trasmettere dati crittografati). Pertanto, non si possono memorizzare informazioni segrete al suo interno. Come l'intestazione, il payload \u00e8 codificato in base64.<br \/>\n<b>Firma<\/b> \u2014 quando abbiamo l'intestazione e il payload, \u00e8 possibile calcolare la firma.<\/p>\n<p>Si prendono i codificati in base64: l'intestazione e il payload, si uniscono in una stringa tramite un punto. Quindi, questa stringa e la chiave segreta vengono inserite nell'algoritmo di crittografia specificato nell'intestazione (chiave \u201calg\u201d). La chiave pu\u00f2 essere qualsiasi stringa. Stringhe pi\u00f9 lunghe saranno preferibili, poich\u00e9 ci vorr\u00e0 pi\u00f9 tempo per il brute forcing.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Costruzione di un'architettura di cluster Keycloak ad alta disponibilit\u00e0<\/h3>\n<p>\nQuando si utilizza un unico cluster per tutti i progetti, si verificano requisiti pi\u00f9 elevati per la soluzione SSO. Quando il numero di progetti \u00e8 limitato, questi requisiti non sono cos\u00ec evidenti per ogni progetto, tuttavia, con l'aumento del numero di utenti e integrazioni, aumentano le esigenze di disponibilit\u00e0 e prestazioni. <\/p>\n<p>L'aumento dei rischi di fallimento del SSO unificato aumenta i requisiti per l'architettura della soluzione e i metodi di ridondanza dei componenti, portando a un SLA molto rigido. Di conseguenza, durante lo sviluppo o nelle fasi iniziali di implementazione delle soluzioni, i progetti presentano spesso un'infrastruttura non resiliente. Con l'evoluzione, \u00e8 necessario prevedere opportunit\u00e0 di sviluppo e scalabilit\u00e0. \u00c8 pi\u00f9 flessibile costruire un cluster resiliente utilizzando la virtualizzazione a container o un approccio ibrido. <\/p>\n<p>Per operare in modalit\u00e0 Active\/Active e Active\/Passive di un cluster, \u00e8 necessario garantire la coerenza dei dati nel database relazionale: entrambi i nodi del database devono essere replicati in modo sincrono tra i diversi data center distribuiti geograficamente.<\/p>\n<p>Il pi\u00f9 semplice esempio di un'installazione resiliente.<\/p>\n<p><img decoding=\"async\" alt=\"SSO su architettura a microservizi. Utilizziamo Keycloak. Parte n. 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuali vantaggi offre l'utilizzo di un cluster unificato:<\/p>\n<ul>\n<li>Alta disponibilit\u00e0 e prestazioni.<\/li>\n<li>Supporto per modalit\u00e0 operative: Active\/Active, Active\/Passive.<\/li>\n<li>Possibilit\u00e0 di scalabilit\u00e0 dinamica \u2014 in utilizzo con la virtualizzazione a container.<\/li>\n<li>Possibilit\u00e0 di gestione e monitoraggio centralizzati.<\/li>\n<li>Un approccio unificato per l'identificazione\/autenticazione\/autorizzazione degli utenti nei progetti.<\/li>\n<li>Interazione pi\u00f9 trasparente tra diversi progetti senza il coinvolgimento degli utenti.<\/li>\n<li>Possibilit\u00e0 di riutilizzare il token JWT in diversi progetti.<\/li>\n<li>Unico punto di fiducia.<\/li>\n<li>Avvio pi\u00f9 rapido dei progetti utilizzando microservizi\/virtualizzazione a container (non \u00e8 necessaria l'installazione e configurazione di componenti aggiuntivi).<\/li>\n<li>\u00c8 possibile acquisire supporto commerciale dal fornitore. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Cosa considerare nella pianificazione del cluster<\/h3>\n<p><\/p>\n<h4>DBMS<\/h4>\n<p>\nKeycloak utilizza un sistema di gestione del DBMS per memorizzare: realms, clients, users, ecc.<br \/>\n\u00c8 supportata una vasta gamma di DBMS: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak viene fornito con un proprio database relazionale integrato. Si raccomanda l'uso per ambienti a bassa carico - come gli ambienti di sviluppo.<\/p>\n<p>Per operare in modalit\u00e0 Active\/Active e Active\/Passive di un cluster, \u00e8 necessario garantire la coerenza dei dati nel database relazionale e entrambi i nodi del cluster del database vengono replicati in sincrono tra i data center.<\/p>\n<h4>Cache distribuita (Infinispan)<\/h4>\n<p>\nPer il corretto funzionamento del cluster \u00e8 necessaria una sincronizzazione aggiuntiva dei seguenti tipi di cache utilizzando JBoss Data Grid:<\/p>\n<p>Sessioni di autenticazione \u2014 utilizzate per memorizzare i dati durante l'autenticazione di un utente specifico. Le richieste provenienti da questa cache di solito includono solo il browser e il server Keycloak, e non l'applicazione.<\/p>\n<p>Action tokens \u2014 utilizzati per situazioni in cui l'utente deve confermare un'azione in modo asincrono (via email). Ad esempio, durante il flusso di recupero password, la cache actionTokens Infinispan viene utilizzata per monitorare i metadati sui token delle azioni correlate che sono gi\u00e0 stati utilizzati e quindi non possono essere riutilizzati.<\/p>\n<p>Caching e invalidazione di dati persistenti \u2013 utilizzato per memorizzare nella cache dati persistenti, al fine di evitare richieste eccessive al database. Quando un server Keycloak aggiorna i dati, tutti gli altri server Keycloak in tutti i data center devono esserne a conoscenza.<\/p>\n<p>Work \u2014 utilizzato solo per inviare messaggi di invalidazione tra i nodi del cluster e i data center. <\/p>\n<p>Sessioni utente \u2014 utilizzate per memorizzare i dati sulle sessioni utente, validi durante la sessione del browser dell'utente. La cache deve gestire le richieste HTTP dall'utente finale e dall'applicazione. <\/p>\n<p>Protezione contro attacchi brute force \u2014 utilizzata per monitorare i dati sui tentativi di accesso non riusciti. <\/p>\n<h4>Il bilanciamento del carico<\/h4>\n<p>\nL'equilibratore di carico \u00e8 un unico punto di accesso a Keycloak e deve supportare le sessioni sticky. <\/p>\n<h4>Server delle applicazioni<\/h4>\n<p>\nUtilizzati per controllare l'interazione tra i componenti e possono essere virtualizzati o containerizzati utilizzando strumenti di automazione e di scaling dinamico dell'infrastruttura esistenti. Gli scenari di distribuzione pi\u00f9 comuni sono su OpenShift, Kubernates, Rancher.<\/p>\n<p>Questo conclude la prima parte \u2014 teorica. Nei prossimi cicli di articoli verranno esaminati esempi di integrazioni con vari fornitori di identit\u00e0 e esempi di configurazioni.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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 su architetture a microservizi. Utilizziamo Keycloak. Parte \u21161 | ProHoster","description":"In qualsiasi grande azienda, e il gruppo X5 Retail non fa eccezione, con lo sviluppo cresce il numero di progetti in cui \u00e8 necessaria l'autorizzazione degli utenti.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}