SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Shirkad kasta oo weyn, iyo X5 Tafaariiqda Kooxda ma aha mid ka reeban, sida horumarku u socdo, tirada mashaariicda u baahan oggolaanshaha isticmaalaha ayaa kordha. Muddo ka dib, isticmaalayaasha kala beddelka hal arji oo aan kala go 'lahayn ayaa loo baahan yahay ka dibna waxaa loo baahan yahay in la isticmaalo hal server oo Single-Sing-On (SSO). Laakin waxa la sameeyo marka bixiyayaasha aqoonsiga sida AD ama kuwa kale ee aan lahayn sifooyin dheeri ah mar horeba loo adeegsaday mashaariic kala duwan. Nooc ka mid ah nidaamyada loo yaqaan "dalaaliinta aqoonsiga" ayaa u soo gurman doona. Kuwa ugu shaqeeya waa wakiilladeeda, sida Keycloak, Maareynta Helitaanka Gravitee, iwm. Inta badan, xaaladaha isticmaalka waxay noqon karaan kuwo kala duwan: isdhexgalka mashiinka, ka qaybgalka isticmaalaha, iwm. iyo xalka noocan oo kale ah Shirkadeena hadda waxay leedahay dallaal tilmaame - Keycloak.

SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Keycloak waa aqoonsi il furan iyo badeecada kontoroolka gelitaanka ee ay hayso RedHat. Waa saldhigga alaabta shirkadda ee isticmaalaya SSO - RH-SSO.

Fikradaha aasaasiga ah

Kahor intaadan bilaabin inaad wax ka qabato xalalka iyo dariiqooyinka, waa inaad go'aansataa habraacyada iyo isku xigxiga:

SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Aqoonsiga waa hab lagu aqoonsado mawduuca aqoonsigiisa (si kale haddii loo dhigo, kani waa qeexida magaca, gelida ama lambarka).

Xaqiijinta - tani waa habraac xaqiijin ah (isticmalaha waxaa lagu hubiyaa erayga sirta ah, warqadda waxaa lagu hubiyaa saxeex elektaroonig ah, iwm.)

Oggolaanshaha - waxay siinaysaa marin u helidda kheyraadka (tusaale ahaan, iimaylka).

Furaha furaha aqoonsiga

Furaha waa aqoonsi il furan iyo xalka maaraynta marin-u-helka loogu talagalay in lagu isticmaalo IS halkaas oo qaab-dhismeedka microservice-ka lagu isticmaali karo.

Keycloak waxa uu bixiyaa sifooyin ay ka mid yihiin Saxiix Keliya ah (SSO), Aqoonsiga Dalaaliinta ah iyo Soo Gelitaanka Bulshada, Xiriirka Isticmaalaha, Adabiyeyaasha Macmiilka, Console Admin, iyo Konsole Maamulka Koontada.

Shaqada aasaasiga ah waxaa taageeray Keycloak:

  • Hal-Saxiix u shid iyo ka-saxiix-ka-bax ee codsiyada browser-ka.
  • Taageerada OpenID/OAuth 2.0/SAML.
  • Aqoonsiga Aqoonsiga – xaqiijinta iyadoo la isticmaalayo Xidhiidhka OpenID Connect ama bixiyayaasha aqoonsiga SAML.
  • Soo gal bulsho - Google, GitHub, Facebook, Twitter taageerada aqoonsiga isticmaalaha.
  • Isutagga Isticmaalka - is-waafajinta isticmaalayaasha LDAP iyo adeegayaasha Hagaha Active iyo bixiyeyaasha kale ee aqoonsiga.
  • buundada Kerberos – adeegsiga server-ka Kerberos ee xaqiijinta isticmaale toos ah.
  • Console Admin - oo loogu talagalay maaraynta midaysan ee habaynta iyo cabirrada xalka iyada oo loo marayo Shabakadda.
  • Konsole Maareynta Koontada - oo loogu talagalay is-maamulida astaanta isticmaalaha.
  • Habaynta xalka oo ku salaysan aqoonsiga shirkadeed ee shirkadda.
  • 2FA Xaqiijinta - Taageerada TOTP/HOTP iyadoo la isticmaalayo Google Authenticator ama FreeOTP.
  • Socodka gelitaanka - is-diiwaan gelinta isticmaalaha, soo kabashada erayga sirta ah iyo dib u dejinta, iyo kuwa kale waa suurtagal.
  • Maareynta Kulanka - maareeyayaashu waxay maamuli karaan fadhiyada isticmaalaha hal dhibic.
  • Token Mappers - sifooyinka isticmaalaha, doorarka iyo sifooyinka kale ee loo baahan yahay ee calaamadaha.
  • Maareynta siyaasada dabacsan ee guud ahaan boqortooyada, codsiga iyo isticmaalayaasha.
  • Taageerada CORS - Adabiyeyaasha macaamiishu waxay leeyihiin taageerada CORS ee ku dhex dhisan.
  • Interfaces Bixiyaha Adeegga (SPI) - tiro badan oo SPIs ah oo kuu oggolaanaya inaad habayso qaybaha kala duwan ee server-ka: socodka aqoonsiga, bixiyeyaasha aqoonsiga, khariidaynta borotokoolka iyo wax ka badan.
  • Adabiyeyaasha macmiilka ee codsiyada JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • Taageerada la shaqaynta arjiyada kala duwan ee taageera Maktabada Xidhiidhka Isku-xidhka OpenID ama Maktabada Bixiyaha Adeegga ee SAML 2.0.
  • La balaarin karo iyadoo la isticmaalayo plugins.

Nidaamyada CI / CD, iyo sidoo kale iswada ee hababka maamulka ee Keycloak, REST API / JAVA API waa la isticmaali karaa. Dukumentiyada waxaa lagu heli karaa si elektaroonig ah:

nasasho API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
JAVA API https://www.keycloak.org/docs-api/8.0/javadocs/index.html

Bixiyeyaasha Aqoonsiga Ganacsiga (Meelaha Goobta)

Awoodda lagu xaqiijin karo isticmaalayaasha adeegyada Xiriirka Isticmaalaha.

SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Xaqiijinta ka gudubka sidoo kale waa la isticmaali karaa - haddii isticmaalayaashu ay ka caddeeyaan goobaha shaqada ee Kerberos (LDAP ama AD), markaa si toos ah ayaa loo xaqiijin karaa Keycloak iyada oo aan loo baahnayn in ay galaan isticmaalehooda iyo erayga sirta ah mar kale.

Xaqiijinta iyo oggolaanshaha dheeraadka ah ee isticmaaleyaasha, waxa suurtagal ah in la isticmaalo DBMS-ka xidhiidhsan, kaas oo aadka loogu dabaqi karo deegaanka horumarka, maadaama aanay ku lug lahayn goobo dheer iyo is-dhexgal ah marxaladaha hore ee mashaariicda. Sida caadiga ah, Keycloak waxay isticmaashaa DBMS-ku-dhisan si uu u kaydiyo goobaha iyo xogta isticmaalaha.

Liiska DBMS-yada la taageeray waa mid ballaaran waxaana ka mid ah: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle iyo kuwa kale. Kuwa ugu badan ee la tijaabiyey wakhtigan waa Oracle 12C Release1 RAC iyo Galera 3.12 cluster ee MariaDB 10.1.19.

Bixiyaasha aqoonsiga - galitaanka bulshada

Waa suurtagal in la isticmaalo galitaanka shabakadaha bulshada. Si aad u dhaqaajiso awooda lagu xaqiijinayo isticmaalayaasha, isticmaal maamulaha Keycloack. Isbeddelka koodka arjiga looma baahna oo shaqadani waa laga heli karaa meel ka baxsan sanduuqa waxaana la hawlgelin karaa marxalad kasta oo mashruuca ah.

SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Waa suurtogal in loo isticmaalo bixiyayaasha aqoonsiga OpenID/SAML si loo xaqiijiyo isticmaalaha.

Xaaladaha oggolaanshaha caadiga ah ee OAuth2 ee Keycloak

Socodka Xeerka Ogolaanshaha - loo isticmaalo codsiyada dhinaca server-ka. Mid ka mid ah noocyada ugu caansan ee oggolaanshaha oggolaanshaha sababtoo ah waxay si fiican ugu habboon tahay codsiyada server-ka halkaasoo koodka isha codsiga iyo xogta macmiilku aanay heli karin kuwa dibadda ah. Habka kiiskani wuxuu ku salaysan yahay dib u habeyn. Codsigu waa inuu awood u yeeshaa inuu la xidhiidho wakiilka isticmaalaha (wakiilka adeegsadaha), sida biraawsarraha shabakadda - si loo helo koodka oggolaanshaha API ee lagu hagayo wakiilka isticmaalaha.

socodka aan qarsoonayn - loo isticmaalo moobilka ama codsiyada webka (codsiyada ku socda qalabka isticmaalaha).

Nooca oggolaanshaha daahsoon waxaa adeegsada moobilka iyo arjiyada shabakadu halkaas oo aan sirta macmiilka la damaanad qaadi karin. Nooca ogolaanshaha dahsoon waxa kale oo uu isticmaalaa dib u habaynta wakiilka isticmaalaha, kaas oo calaamada gelitaanka loo gudbiyo wakiilka isticmaalaha si loogu sii isticmaalo codsiga. Tani waxay ka dhigaysaa calaamadda inay heli karaan isticmaaluhu iyo codsiyada kale ee ku jira aaladda isticmaalaha. Nooca oggolaanshahan ma xaqiijinayo aqoonsiga codsiga, iyo habka laftiisa ayaa ku tiirsan URL wareejin (horey uga diiwaan gashan adeegga).

Socodka daahsoon ma taageerayo gelitaanka calaamadaha dib u soo kicinta.

Socodka Deeqaha Shahaadooyinka Macmiilka - waxaa la isticmaalaa marka codsigu galo API. Noocan ogolaanshaha ogolaanshaha waxaa sida caadiga ah loo isticmaalaa isdhexgalka server-ka-server kaas oo ay tahay in lagu sameeyo gadaasha iyada oo aan isla markaaba isticmaale lala hadlin. Shahaadada aqoonsiga macmiilku waxay u ogolaataa adeega shabakada (macmiilka qarsoodiga ah) inuu isticmaalo aqoonsigiisa halkii uu iska dhigi lahaa isticmaale si uu u xaqiijiyo marka uu wacayo adeeg kale oo shabakad ah. Heer sare oo ammaan ah, waxaa suurtagal ah in adeegga wacitaanka uu isticmaalo shahaado (halkii sirta la wadaago) aqoonsi ahaan.

Tilmaamaha OAuth2 ayaa lagu sifeeyay
RFC-6749
RFC-8252
RFC-6819

JWT token iyo faa'iidooyinkeeda

JWT (JSON Web Token) waa halbeeg furanhttps://tools.ietf.org/html/rfc7519), kaas oo qeexaya hab isku dhafan oo isku filan oo si ammaan ah loogu gudbiyo macluumaadka u dhexeeya dhinacyada qaab shay JSON ah.

Marka loo eego halbeegga, calaamaddu waxay ka kooban tahay saddex qaybood oo qaab-saldhig-64 ah, oo ay kala soocaan dhibco. Qaybta hore waxaa loo yaqaan madaxa, oo ka kooban nooca calaamadda iyo magaca algorithm ee xashiishka si loo helo saxeex dijital ah. Qaybta labaad waxay kaydisaa macluumaadka aasaasiga ah (isticmaal, sifooyinka, iwm.). Qaybta saddexaad waa saxiixa dhijitaalka ah.

. .
Waligaa calaamad ha ku kaydin DB-gaaga Sababtoo ah calaamad sax ah waxay u dhigantaa erayga sirta ah, kaydinta calaamaduhu waxay la mid tahay kaydinta erayga sirta ah qoraal cad.
Calaamada gelitaanka waa calaamad siinaysa milkiilaheeda helitaanka agabyada server-ka sugan. Caadi ahaan waxa ay haysataa cimri gaaban waxaana laga yaabaa in ay sido macluumaad dheeraad ah sida ciwaanka IP-ga ee kooxda codsanaysa calaamada.

Calaamadee dib u cusboonaysii waa calaamad u oggolaanaysa macaamiisha inay codsadaan calaamado gelitaan cusub ka dib markay cimrigoodu dhammaato. Calaamadahaan waxaa badanaa la soo saaraa muddo dheer.

Faa'iidooyinka ugu muhiimsan ee isticmaalka mikroservice architecture:

  • Awoodda helitaanka codsiyada iyo adeegyada kala duwan iyada oo loo marayo xaqiijin hal mar ah.
  • Maqnaanshaha tiro ka mid ah sifooyinka loo baahan yahay ee astaanta isticmaalaha, waxaa suurtagal ah in lagu kobciyo xogta lagu dari karo culeyska, oo ay ku jiraan si toos ah iyo duulista.
  • Looma baahna in la kaydiyo macluumaadka ku saabsan fadhiyada firfircoon, codsiga serverka wuxuu u baahan yahay oo kaliya inuu xaqiijiyo saxiixa.
  • Xakamaynta gelitaanka dabacsanaan badan iyada oo loo marayo sifooyin dheeraad ah oo ku jira culeyska mushaharka.
  • Isticmaalka saxiixa calaamadda madaxa iyo culeyska culeyska waxay kordhisaa amniga xalka guud ahaan.

JWT token - halabuurka

Madaxa - Sida caadiga ah, madaxa ayaa ka kooban kaliya nooca calaamada iyo algoorithm ee loo isticmaalo sirta.

Nooca calaamadda waxa lagu kaydiyaa furaha "typ". Furaha 'nooca' waa la iska indhatiray gudaha JWT. Haddii furaha "typ" uu jiro, qiimihiisu waa inuu noqdaa JWT si loo muujiyo in shaygani yahay JSON Web Token.

Furaha labaad "alg" ayaa qeexaya algorithm-ka loo isticmaalo in lagu sireeyo calaamadda. Waa in lagu dejiyaa HS256 si caadi ah. Cinwaanka madaxa waxa uu ku qoran yahay base64.

{"alg": "HS256", "nooca": "JWT"}
culayska (content) - culayska culaysku waxa uu kaydiyaa xog kasta oo u baahan in la hubiyo. Fure kasta oo ku jira culeyska lacag bixinta waxaa loo yaqaanaa "dacwad". Tusaale ahaan, waxaad gali kartaa arjiga kaliya martiqaad (xiran promo). Marka aan rabno inaan ku martiqaadno qof ka qaybqaata, waxaan u dirnaa warqad martiqaad ah. Waxaa muhiim ah in la hubiyo in ciwaanka emailka uu leeyahay qofka aqbala martiqaadka, markaa waxaanu ku dari doonaa ciwaankan culayska la saarayo, taas awgeed waxaanu ku kaydinaynaa furaha "emailka"

{"email":"[emailka waa la ilaaliyay]"}

Furayaasha rarka lacag bixinta waxay noqon karaan sabab la'aan. Si kastaba ha ahaatee, waxaa jira qaar ka mid ah:

  • iss (Isu-bixiye) - Wuxuu aqoonsadaa codsiga laga soo diray calaamadda.
  • sub (Mawduuca) - wuxuu qeexayaa mawduuca calaamadda.
  • aud (Dhagaystayaasha) waa xargaha kiiska xasaasiga ah ama URIs oo ah liiska dadka qaata calaamadan. Marka dhinaca qaataha uu helo JWT oo leh furaha la bixiyay, waa inay hubisaa joogitaanka laftiisa ee qaataha - haddii kale iska dhaaf calaamadda.
  • expiration (Expiration Time) - Waxay muujinaysaa marka calaamaduhu dhacayo. Halbeegga JWT wuxuu u baahan yahay dhammaan hirgelintiisa si loo diido calaamadihii dhacay. Furaha furaha waa inuu noqdaa shaambad waqtiyeed oo qaab unix ah.
  • nbf (Ma Horay) waa wakhti qaab unix ah oo go'aamiya wakhtiga ay calaamaddu shaqaynayso.
  • iat (La soo saaray At) - Furahani wuxuu matalaa wakhtiga calaamada la soo saaray waxaana loo isticmaali karaa in lagu go'aamiyo da'da JWT. Furaha iat waa inuu noqdaa shaambad waqtiyeed qaab unix ah.
  • Jti (JWT ID) - xadhig qeexaya aqoonsiga gaarka ah ee calaamaddan, kiis xasaasi ah.

Waxaa muhiim ah in la fahmo in culeyska culeyska ah aan lagu gudbin qaab sir ah (in kasta oo calaamaduhu la dhejin karo oo ay suurtagal tahay in la gudbiyo xogta sirta ah). Sidaa darteed, ma kaydin karto xog sir ah. Si la mid ah madaxa, culeyska culeysku waa base64 codeed.
Saxiixa - Marka aan haysano darajada iyo culeyska, waxaan xisaabin karnaa saxiixa.

Base64-encoded: madaxa iyo culeyska lacagta ayaa la qaadayaa, waxaa la isugu geynayaa xargo iyadoo la marayo dhibic. Markaa xadhigan iyo furaha sirta ah waxa lagu geliyaa algorithmamka sireed ee ku qeexan madaxa ("furaha"alg"). Furaha wuxuu noqon karaa xadhig kasta. Xadhkaha dhaadheer ayaa aad loo door bidi doonaa maadaama ay qaadan doonto waqti dheer in la soo qaado.

{"alg":"RSA1_5","loadload":"A128CBC-HS256"}

Dhisidda Qaab-dhismeedka Kooxda Guul-darraysatay ee Koodhka Furaha

Marka la isticmaalayo hal koox dhammaan mashaariicda, waxaa jira shuruudo kordhay oo xal SSO ah. Marka tirada mashruucyadu yar yihiin, shuruudahani maaha kuwo aad u muuqda dhammaan mashaariicda, si kastaba ha ahaatee, korodhka tirada isticmaalayaasha iyo isdhexgalka, shuruudaha helitaanka iyo waxqabadka ayaa kordhaya.

Khatarta sii kordheysa ee guuldarada hal SSO waxay kordhisaa shuruudaha qaab dhismeedka xalka iyo hababka loo isticmaalo dib-u-celinta qaybaha waxayna keenaysaa SLA aad u adag. Marka tan la eego, inta badan inta lagu jiro horumarinta ama marxaladaha hore ee hirgelinta xalalka, mashruucyadu waxay leeyihiin kaabayaal u gaar ah oo aan khalad ahayn. Marka uu horumarku socdo, waxa loo baahan yahay in la dejiyo fursadaha horumarka iyo miisaanka. Aad bay u dabacsan tahay in la dhiso koox guuldarraysa iyadoo la adeegsanayo hab-dhaqanka weelka ama hab isku-dhafan.

Si aad ugu shaqeyso qaababka kooxda firfircoon ee Firfircoon iyo Firfircoon/Passive, waxaa lagama maarmaan ah in la hubiyo joogtaynta xogta xogta xogta ee xidhiidhka -labada noonada xogta waa in si isku mid ah loogu soo koobo inta u dhaxaysa xarumaha xogta juqraafi qaybsan ee kala duwan.

Tusaalaha ugu fudud ee rakibidda cillad-u-dulqaadashada.

SSO oo ku saabsan qaab-dhismeedka microservice. Waxaan isticmaalnaa Keycloak. Qaybta #1

Waa maxay faa'iidooyinka isticmaalka hal koox:

  • Helitaanka sare iyo waxqabadka.
  • Taageer hababka hawlgalka: Firfircoon/firfircoon, Firfircoon/Passive.
  • Awoodda si firfircooni leh loo cabbiro - marka la isticmaalayo hab-dhaqanka weelka.
  • Suurtagalnimada maamul dhexe iyo la socodka.
  • Habka midaysan ee aqoonsiga / xaqiijinta / oggolaanshaha isticmaalayaasha mashaariicda.
  • Is dhexgalka hufan oo ka dhexeeya mashruucyo kala duwan iyada oo aan isticmaaluhu ku lug lahayn.
  • Awoodda dib loogu isticmaalo calaamadda JWT ee mashaariicda kala duwan.
  • Hal dhibic oo aamin ah.
  • Bilaabida dhaqsaha badan ee mashaariicda iyadoo la adeegsanayo adeeg-yaraha/koonteenarada wax-qabadka (looma baahna in kor loo qaado oo la habeeyo qaybo dheeraad ah).
  • Waxaa suurtagal ah in laga iibsado taageero ganacsi oo laga helo iibiyaha.

Waxa la Raadiyo Marka la Qorsheynayo Koox

DBMS

Keycloak waxay isticmaashaa nidaamka maaraynta xogta xogta si uu u kaydiyo: xaqiiqooyinka, macaamiisha, isticmaalayaasha, iwm.
Noocyo badan oo DBMS ah ayaa la taageeraa: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak waxay la timid xog-ururinta oo ku dhex dhisan. Waxaa lagu talinayaa in loo isticmaalo goobaha aan la rarin - sida deegaanka horumarinta.

Si aad ugu shaqeyso qaababka kooxda firfircoon ee Firfircoon iyo Firfircoon/Passive, joogtaynta xogta xogta xogta ee xidhiidhka ah ayaa loo baahan yahay, iyo labada nambar xogta xogta si isku mid ah ayaa loogu soo koobay xarumaha xogta.

Cache qaybsan (Infinspan)

Si kooxdu ay si sax ah u shaqeyso, is-waafajin dheeraad ah oo ah noocyada soo socda ee kaydinta iyadoo la adeegsanayo Shabakadda Xogta JBoss ayaa loo baahan yahay:

Fadhiyada xaqiijinta - waxaa loo isticmaalaa in lagu kaydiyo xogta marka la xaqiijinayo isticmaale gaar ah. Codsiyada khasnaddan sida caadiga ah waxa ku jira browserka iyo seerfarka Keycloak, ma aha codsiga.

Calaamadaha ficilka waxaa loo isticmaalaa xaaladaha halka isticmaaluhu u baahan yahay inuu xaqiijiyo ficilka si isku mid ah (imaylka). Tusaale ahaan, inta lagu jiro qulqulka erayga sirta ah, actionTokens Infinispan cache waxa loo isticmaalaa in lagu hayo xogta badan ee ku saabsan calaamadaha ficillada la xidhiidha ee hore loo isticmaalay, markaa dib looma isticmaali karo.

Kaydinta iyo burinta xogta joogtada ah - waxaa loo isticmaalaa in lagu kaydiyo xogta joogtada ah si looga fogaado su'aalaha aan loo baahnayn ee xogta. Marka server-ka Keycloak uu cusboonaysiiyo xogta, dhammaan adeegayaasha kale ee Keycloak ee dhammaan xarumaha xogta waa in ay ogaadaan.

Shaqada - Kaliya waxaa loo isticmaalaa in lagu diro fariimaha aan saxda ahayn inta u dhaxaysa qanjidhada kooxda iyo xarumaha xogta.

Kalfadhiyada isticmaalaha - waxaa loo isticmaalaa in lagu kaydiyo xogta ku saabsan fadhiyada isticmaalaha kuwaas oo ansax ah inta uu socdo kulanka browserka isticmaalaha. Cache-gu waa in uu habeeyaa codsiyada HTTP ee isticmaalaha ugu dambeeya iyo arjiga.

Ilaalinta xoogga qallafsan - waxaa loo isticmaalaa si loola socdo xogta ku saabsan gelitaannada fashilmay.

Isku dheelitirka culeyska

Isku-dheellitirka culeysku waa meesha kaliya ee laga soo galo furaha furaha waana in ay taageertaa fadhiyada dhegdhegaysan.

Adeegayaasha Codsiga

Waxaa loo isticmaalaa in lagu xakameeyo isdhexgalka qaybaha midba midka kale waxaana lagu dhejin karaa ama lagu kaydin karaa iyada oo la adeegsanayo qalabyada iswada ee jira iyo cabbirka firfircoon ee qalabka iswada ee kaabayaasha. Dabeecadaha geynta ugu badan ee OpenShift, Kubernates, Rancher.

Tani waxay soo gabagabeyneysaa qaybta koowaad - midda aragtida. Maqaallada taxanaha ah ee soo socda, tusaalooyinka is-dhexgalka ee bixiyayaasha aqoonsiga ee kala duwan iyo tusaalooyinka habaynta ayaa lagu lafaguri doonaa.

Source: www.habr.com

Add a comment