OpenID Connect: awtorizzazzjoni ta' applikazzjonijiet interni minn custom għal standard

Ftit xhur ilu, kont qed nimplimenta server OpenID Connect biex jimmaniġġja l-aċċess għal mijiet tal-applikazzjonijiet interni tagħna. Mill-iżviluppi tagħna stess, konvenjenti fuq skala iżgħar, imxejna għal standard ġeneralment aċċettat. L-aċċess permezz tas-servizz ċentrali jissimplifika bil-kbir l-operazzjonijiet monotoni, inaqqas l-ispiża tal-implimentazzjoni tal-awtorizzazzjonijiet, jippermettilek issib ħafna soluzzjonijiet lesti u ma tiġborx imħuħ meta tiżviluppa oħrajn ġodda. F'dan l-artikolu, se nitkellem dwar din it-tranżizzjoni u l-ħotob li rnexxielna nimlew.

OpenID Connect: awtorizzazzjoni ta' applikazzjonijiet interni minn custom għal standard

Żmien ilu... Kif beda kollox

Ftit snin ilu, meta kien hemm wisq applikazzjonijiet interni għall-kontroll manwali, ktibna applikazzjoni biex nikkontrollaw l-aċċess fi ħdan il-kumpanija. Kienet applikazzjoni sempliċi ta' Rails li konnessa ma' database b'informazzjoni dwar l-impjegati, fejn ġie kkonfigurat aċċess għal diversi funzjonalitajiet. Fl-istess ħin, qajjimna l-ewwel SSO, li kien ibbażat fuq il-verifika tat-tokens min-naħa tal-klijent u s-server tal-awtorizzazzjoni, it-token ġie trażmess f'forma kriptata b'diversi parametri u vverifikat fuq is-server tal-awtorizzazzjoni. Din ma kinitx l-aktar għażla konvenjenti, peress li kull applikazzjoni interna kellha tiddeskrivi saff konsiderevoli ta 'loġika, u d-databases tal-impjegati kienu kompletament sinkronizzati mas-server tal-awtorizzazzjoni.

Wara xi żmien, iddeċidejna li nissimplifikaw il-kompitu ta 'awtorizzazzjoni ċentralizzata. SSO ġie trasferit lill-balancer. Bl-għajnuna ta 'OpenResty, ġie miżjud mudell ma' Lua li ċċekkja t-tokens, kien jaf għal liema applikazzjoni kienet sejra t-talba, u seta 'jiċċekkja jekk kienx hemm aċċess hemmhekk. Dan l-approċċ issimplifika ħafna l-kompitu tal-kontroll tal-aċċess għall-applikazzjonijiet interni - fil-kodiċi ta 'kull applikazzjoni, ma kienx għadu meħtieġ li tiġi deskritta loġika addizzjonali. Bħala riżultat, għalaqna t-traffiku esternament, u l-applikazzjoni nnifisha ma kienet taf xejn dwar l-awtorizzazzjoni.

Madankollu, problema waħda baqgħet mhux solvuta. Xi ngħidu dwar l-applikazzjonijiet li jeħtieġu informazzjoni dwar l-impjegati? Kien possibbli li tikteb API għas-servizz ta 'awtorizzazzjoni, iżda mbagħad ikollok iżżid loġika addizzjonali għal kull applikazzjoni bħal din. Barra minn hekk, ridna neħilsu mid-dipendenza fuq waħda mill-applikazzjonijiet miktuba minnha nfusna, orjentata fil-futur għat-traduzzjoni f'OpenSource, fuq is-server tal-awtorizzazzjoni interna tagħna. Nitkellmu dwarha xi żmien ieħor. Is-soluzzjoni għaż-żewġ problemi kienet OAuth.

għal standards komuni

OAuth huwa standard ta 'awtorizzazzjoni li jinftiehem, ġeneralment aċċettat, iżda peress li l-funzjonalità tiegħu biss mhix biżżejjed, huma immedjatament bdew jikkunsidraw OpenID Connect (OIDC). OIDC innifsu huwa t-tielet implimentazzjoni tal-istandard ta 'awtentikazzjoni miftuħa, li nixxa f'add-on fuq il-protokoll OAuth 2.0 (protokoll ta' awtorizzazzjoni miftuħa). Din is-soluzzjoni tagħlaq il-problema tan-nuqqas ta 'dejta dwar l-utent aħħari, u tagħmilha wkoll possibbli li jinbidel il-fornitur tal-awtorizzazzjoni.

Madankollu, aħna ma għażilniex fornitur speċifiku u ddeċidejna li nżidu l-integrazzjoni ma 'OIDC għas-server ta' awtorizzazzjoni eżistenti tagħna. Favur din id-deċiżjoni kien il-fatt li l-OIDC hija flessibbli ħafna f'termini ta' awtorizzazzjoni għall-utent aħħari. Għalhekk, kien possibbli li jiġi implimentat l-appoġġ OIDC fuq is-server tal-awtorizzazzjoni attwali tiegħek.

OpenID Connect: awtorizzazzjoni ta' applikazzjonijiet interni minn custom għal standard

Il-mod tagħna kif nimplimentaw is-server OIDC tagħna stess

1) Ġib id-data fil-forma mixtieqa

Biex tintegra l-OIDC, huwa meħtieġ li d-dejta tal-utent attwali tinġieb f'forma li tinftiehem mill-istandard. Fl-OIDC dan jissejjaħ Claims. It-talbiet huma essenzjalment oqsma finali fid-database tal-utent (isem, email, telefon, eċċ.). Teżisti lista standard ta’ bolol, u dak kollu li mhux inkluż f'din il-lista huwa meqjus bħala drawwa. Għalhekk, l-ewwel punt li għandek bżonn tagħti attenzjoni jekk trid tagħżel fornitur OIDC eżistenti hija l-possibbiltà ta 'adattament konvenjenti ta' marki ġodda.

Il-grupp tal-marki huwa kkombinat fis-subsett li ġej - Skop. Waqt l-awtorizzazzjoni, jintalab aċċess mhux għal marki speċifiċi, iżda għal ambiti, anke jekk xi wħud mill-marki mill-ambitu mhumiex meħtieġa.

2) Implimenta l-għotjiet meħtieġa

Il-parti li jmiss tal-integrazzjoni tal-OIDC hija l-għażla u l-implimentazzjoni tat-tipi ta 'awtorizzazzjoni, l-hekk imsejħa għotjiet. Ix-xenarju ulterjuri ta' interazzjoni bejn l-applikazzjoni magħżula u s-server tal-awtorizzazzjoni jiddependi fuq l-għotja magħżula. Skema eżemplari għall-għażla tal-għotja t-tajba tidher fil-figura hawn taħt.

OpenID Connect: awtorizzazzjoni ta' applikazzjonijiet interni minn custom għal standard

Għall-ewwel applikazzjoni tagħna, użajna l-aktar għotja komuni, il-Kodiċi ta’ Awtorizzazzjoni. Id-differenza tagħha minn oħrajn hija li hija fi tliet stadji, i.e. għaddejja minn testijiet addizzjonali. L-ewwel, l-utent jagħmel talba għal permess ta 'awtorizzazzjoni, jirċievi token - Kodiċi ta' Awtorizzazzjoni, imbagħad b'dan it-token, bħallikieku b'biljett għall-ivvjaġġar, jitlob token ta 'aċċess. L-interazzjoni prinċipali kollha ta 'dan l-iskrittura ta' awtorizzazzjoni hija bbażata fuq redirects bejn l-applikazzjoni u s-server ta 'awtorizzazzjoni. Tista' taqra aktar dwar din l-għotja hawn.

OAuth jaderixxi mal-kunċett li t-tokens ta 'aċċess miksuba wara l-awtorizzazzjoni għandhom ikunu temporanji u jinbidlu preferibbilment kull 10 minuti bħala medja. L-għotja tal-Kodiċi ta 'Awtorizzazzjoni hija verifika fi tliet stadji permezz ta' redirects, kull 10 minuti biex iddawwar pass bħal dan, franchement, mhuwiex l-aktar kompitu pjaċevoli għall-għajnejn. Biex insolvu din il-problema, hemm għotja oħra – Refresh Token, li użajna wkoll f’pajjiżna. Kollox huwa aktar faċli hawn. Waqt il-verifika minn għotja oħra, minbarra t-token tal-aċċess ewlieni, jinħareġ ieħor - Refresh Token, li jista 'jintuża darba biss u l-ħajja tiegħu ġeneralment tkun ħafna itwal. B'dan it-Token ta' Aġġorna, meta jintemm it-TTL (Time to Live) tat-token ta' aċċess prinċipali, it-talba għal token ta' aċċess ġdid se tasal sal-punt tat-tmiem ta 'għotja oħra. It-Token tal-Aġġorna użat huwa immedjatament reset għal żero. Dan il-kontroll huwa f'żewġ stadji u jista 'jitwettaq fl-isfond, imperċettibbli għall-utent.

3) Twaqqaf formati ta 'output tad-data tad-dwana

Wara li l-għotjiet magħżula jiġu implimentati, l-awtorizzazzjoni taħdem, ta 'min isemmi li tinkiseb data dwar l-utent aħħari. L-OIDC għandha endpoint separat għal dan, fejn tista' titlob dejta tal-utent bit-token tal-aċċess attwali tiegħek u jekk hijiex aġġornata. U jekk id-dejta tal-utent ma tinbidilx daqshekk spiss, u għandek bżonn issegwi dawk attwali ħafna drabi, tista 'tasal għal soluzzjoni bħal JWT tokens. Dawn it-tokens huma wkoll appoġġjati mill-istandard. It-token JWT innifsu jikkonsisti fi tliet partijiet: header (informazzjoni dwar it-token), payload (kwalunkwe data meħtieġa) u firma (firma, it-token huwa ffirmat mis-server u aktar tard tista 'tiċċekkja s-sors tal-firma tiegħu).

Fl-implimentazzjoni OIDC, it-token JWT jissejjaħ id_token. Jista' jintalab flimkien ma' token ta' aċċess normali u kulma fadal huwa li tivverifika l-firma. Is-server tal-awtorizzazzjoni għandu endpoint separat għal dan b'mazz ta 'ċwievet pubbliċi fil-format J.W.K.. U meta wieħed jitkellem dwar dan, ta 'min isemmi li hemm endpoint ieħor, li, ibbażat fuq l-istandard RFC5785 tirrifletti l-konfigurazzjoni attwali tas-server OIDC. Fiha l-indirizzi kollha tal-endpoint (inkluż l-indirizz taċ-ċavetta pubblika użata għall-iffirmar), marki u ambiti appoġġjati, algoritmi ta’ kriptaġġ użati, għotjiet appoġġjati, eċċ.

Per eżempju fuq Google:

{
 "issuer": "https://accounts.google.com",
 "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
 "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
 "token_endpoint": "https://oauth2.googleapis.com/token",
 "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
 "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
 "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
 "response_types_supported": [
  "code",
  "token",
  "id_token",
  "code token",
  "code id_token",
  "token id_token",
  "code token id_token",
  "none"
 ],
 "subject_types_supported": [
  "public"
 ],
 "id_token_signing_alg_values_supported": [
  "RS256"
 ],
 "scopes_supported": [
  "openid",
  "email",
  "profile"
 ],
 "token_endpoint_auth_methods_supported": [
  "client_secret_post",
  "client_secret_basic"
 ],
 "claims_supported": [
  "aud",
  "email",
  "email_verified",
  "exp",
  "family_name",
  "given_name",
  "iat",
  "iss",
  "locale",
  "name",
  "picture",
  "sub"
 ],
 "code_challenge_methods_supported": [
  "plain",
  "S256"
 ],
 "grant_types_supported": [
  "authorization_code",
  "refresh_token",
  "urn:ietf:params:oauth:grant-type:device_code",
  "urn:ietf:params:oauth:grant-type:jwt-bearer"
 ]
}

Għalhekk, billi tuża id_token, tista 'tittrasferixxi l-marki kollha meħtieġa għat-tagħbija tat-token u ma tikkuntattjax is-server tal-awtorizzazzjoni kull darba biex titlob id-dejta tal-utent. L-iżvantaġġ ta 'dan l-approċċ huwa li l-bidla fid-dejta tal-utent mis-server ma tiġix immedjatament, iżda flimkien ma' token ta 'aċċess ġdid.

Riżultati ta' implimentazzjoni

Allura, wara li mplimentajna s-server OIDC tagħna stess u kkonfigurajna l-konnessjonijiet miegħu fuq in-naħa tal-applikazzjoni, solvejna l-problema tat-trasferiment ta 'informazzjoni dwar l-utenti.
Peress li l-OIDC huwa standard miftuħ, għandna l-għażla li nagħżlu fornitur eżistenti jew implimentazzjoni ta 'server. Ippruvajna Keycloak, li rriżulta li kien konvenjenti ħafna biex jiġi kkonfigurat, wara li waqqafna u nbidel il-konfigurazzjonijiet tal-konnessjoni fuq in-naħa tal-applikazzjoni, huwa lest biex imur. Fuq in-naħa tal-applikazzjoni, dak kollu li jibqa 'huwa li tbiddel il-konfigurazzjonijiet tal-konnessjoni.

Nitkellmu dwar soluzzjonijiet eżistenti

Fi ħdan l-organizzazzjoni tagħna, bħala l-ewwel server OIDC, għamilna l-implimentazzjoni tagħna stess, li ġiet issupplimentata kif meħtieġ. Wara reviżjoni dettaljata ta 'soluzzjonijiet lesti oħra, nistgħu ngħidu li dan huwa punt bla dubju. Favur id-deċiżjoni li jimplimentaw is-server tagħhom stess, kien hemm tħassib min-naħa tal-fornituri fin-nuqqas tal-funzjonalità meħtieġa, kif ukoll il-preżenza ta 'sistema antika li fiha kien hemm awtorizzazzjonijiet tad-dwana differenti għal xi servizzi u pjuttost ħafna tad-dejta dwar l-impjegati kienet diġà maħżuna. Madankollu, f'implimentazzjonijiet lesti, hemm konvenjenzi għall-integrazzjoni. Pereżempju, Keycloak għandu s-sistema ta 'ġestjoni tal-utenti tiegħu stess u d-data hija maħżuna direttament fiha, u mhux se jkun diffiċli li taqbeż lill-utenti tiegħek hemmhekk. Biex tagħmel dan, Keycloak għandu API li jippermettilek twettaq bis-sħiħ l-azzjonijiet ta 'trasferiment kollha meħtieġa.

Eżempju ieħor ta 'implimentazzjoni ċċertifikata, interessanti, fl-opinjoni tiegħi, hija Ory Hydra. Huwa interessanti għaliex jikkonsisti f'komponenti differenti. Biex tintegra, ser ikollok bżonn torbot is-servizz tal-ġestjoni tal-utenti tiegħek mas-servizz tal-awtorizzazzjoni tagħhom u testendi kif meħtieġ.

Keycloak u Ory Hydra mhumiex l-uniċi soluzzjonijiet off-the-shelf. L-aħjar huwa li tagħżel implimentazzjoni ċċertifikata mill-OpenID Foundation. Dawn is-soluzzjonijiet normalment ikollhom badge ta' Ċertifikazzjoni OpenID.

OpenID Connect: awtorizzazzjoni ta' applikazzjonijiet interni minn custom għal standard

Tinsiex ukoll dwar il-fornituri mħallsa eżistenti jekk ma tridx iżżomm is-server OIDC tiegħek. Illum hemm ħafna għażliet tajbin.

X'hemm Li jmiss

Fil-futur qarib, se nagħlqu t-traffiku għas-servizzi interni b’mod differenti. Qed nippjanaw li nittrasferixxu l-SSO attwali tagħna fuq il-balancer billi tuża OpenResty għal prokura bbażata fuq OAuth. Diġà hemm ħafna soluzzjonijiet lesti hawn, pereżempju:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Materjali addizzjonali

jwt.io – servizz tajjeb għall-validazzjoni tat-tokens JWT
openid.net/developers/certified - lista ta' implimentazzjonijiet OIDC ċertifikati

Sors: www.habr.com

Żid kumment