OpenID Connect: otorizasyon aplikasyon entèn soti nan koutim nan estanda

Sa gen kèk mwa, mwen t ap aplike yon sèvè OpenID Connect pou jere aksè pou plizyè santèn aplikasyon entèn nou yo. Soti nan devlopman pwòp nou yo, pratik sou yon echèl ki pi piti, nou te deplase nan yon estanda jeneralman aksepte. Aksè atravè sèvis santral la anpil senplifye operasyon monotòn, redwi pri pou mete otorizasyon yo, pèmèt ou jwenn anpil solisyon pare yo epi yo pa fè sèvo ou lè w ap devlope nouvo. Nan atik sa a, mwen pral pale sou tranzisyon sa a ak monte desann yo ke nou jere ranpli.

OpenID Connect: otorizasyon aplikasyon entèn soti nan koutim nan estanda

Yon bon bout tan de sa... Ki jan tout bagay te kòmanse

Kèk ane de sa, lè te gen twòp aplikasyon entèn pou kontwòl manyèl, nou te ekri yon aplikasyon pou kontwole aksè nan konpayi an. Se te yon senp aplikasyon Rails ki konekte ak yon baz done ak enfòmasyon sou anplwaye yo, kote aksè a divès fonksyon yo te configuré. An menm tan an, nou leve soti vivan premye SSO a, ki te baze sou verifikasyon an nan marqueur soti nan bò a nan kliyan an ak sèvè a otorizasyon, siy la te transmèt nan fòm chiffres ak plizyè paramèt ak verifye sou sèvè a otorizasyon. Sa a pa t 'opsyon ki pi pratik, paske chak aplikasyon entèn te dwe dekri yon kouch konsiderab nan lojik, ak baz done anplwaye yo te konplètman senkronize ak sèvè a otorizasyon.

Apre kèk tan, nou deside senplifye travay la nan otorizasyon santralize. SSO te transfere nan balans lan. Avèk èd nan OpenResty, yo te ajoute yon modèl nan Lua ki tcheke marqueur, te konnen ki aplikasyon demann lan ta prale, epi li te kapab tcheke si te gen aksè la. Apwòch sa a anpil senplifye travay la nan kontwole aksè nan aplikasyon entèn yo - nan kòd la nan chak aplikasyon, li pa t 'tankou nesesè yo dekri lojik adisyonèl. Kòm yon rezilta, nou fèmen trafik la deyò, ak aplikasyon an li menm pa t 'konnen anyen sou otorizasyon.

Sepandan, yon pwoblèm te rete san rezoud. E aplikasyon ki bezwen enfòmasyon sou anplwaye yo? Li te posib yo ekri yon API pou sèvis la otorizasyon, men Lè sa a, ou ta dwe ajoute lojik adisyonèl pou chak aplikasyon sa yo. Anplis de sa, nou te vle debarase m de depandans sou youn nan aplikasyon nou yo ekri pwòp tèt ou, oryante alavni pou tradiksyon nan OpenSource, sou sèvè otorizasyon entèn nou an. Nou pral pale sou li yon lòt fwa. Solisyon tou de pwoblèm yo te OAuth.

nan estanda komen

OAuth se yon estanda otorizasyon konprann, jeneralman aksepte, men kòm sèlman fonksyonalite li yo pa ase, yo imedyatman te kòmanse konsidere OpenID Connect (OIDC). OIDC tèt li se twazyèm aplikasyon estanda otantifikasyon ouvè a, ki te antre nan yon adisyon sou pwotokòl OAuth 2.0 (yon pwotokòl otorizasyon ouvè). Solisyon sa a fèmen pwoblèm nan nan mank de done sou itilizatè final la, epi tou li fè li posib chanje founisè otorizasyon an.

Sepandan, nou pa t chwazi yon founisè espesifik epi nou te deside ajoute entegrasyon ak OIDC pou sèvè otorizasyon nou an ki egziste deja. An favè desizyon sa a te lefèt ke OIDC trè fleksib an tèm de otorizasyon itilizatè fen. Kidonk, li te posib pou aplike sipò OIDC sou sèvè otorizasyon ou ye kounye a.

OpenID Connect: otorizasyon aplikasyon entèn soti nan koutim nan estanda

Fason nou pou aplike pwòp sèvè OIDC nou an

1) Pote done yo nan fòm ou vle a

Pou entegre OIDC, li nesesè pou pote done aktyèl itilizatè yo nan yon fòm estanda a konprann. Nan OIDC yo rele sa Claims. Reklamasyon yo se esansyèlman dènye jaden nan baz done itilizatè a (non, imèl, telefòn, elatriye). Egziste lis estanda koupon pou achte, ak tout bagay ki pa enkli nan lis sa a konsidere kòm koutim. Se poutèt sa, premye pwen ke ou bezwen peye atansyon a si ou vle chwazi yon founisè OIDC ki deja egziste se posibilite pou personnalisation pratik nan nouvo mak.

Gwoup karakteristik yo konbine nan subset sa a - Dimansyon. Pandan otorizasyon, yo mande aksè pa nan mak espesifik, men nan dimansyon, menm si kèk nan mak yo nan sijè ki abòde lan pa nesesè.

2) Enplemante sibvansyon ki nesesè yo

Pwochen pati nan entegrasyon OIDC se seleksyon ak aplikasyon kalite otorizasyon, sa yo rele sibvansyon yo. Plis senaryo entèraksyon ant aplikasyon an chwazi a ak sèvè otorizasyon an pral depann de sibvansyon yo chwazi a. Yon konplo egzanplè pou chwazi bon sibvansyon yo montre nan figi ki anba a.

OpenID Connect: otorizasyon aplikasyon entèn soti nan koutim nan estanda

Pou premye aplikasyon nou an, nou te itilize sibvansyon ki pi komen an, Kòd Otorizasyon an. Diferans li nan men lòt moun se ke li se yon twa etap, i.e. ap sibi tès adisyonèl. Premyèman, itilizatè a fè yon demann pou pèmisyon otorizasyon, resevwa yon siy - Kòd Otorizasyon, Lè sa a, ak siy sa a, tankou si ak yon tikè pou vwayaje, mande yon siy aksè. Tout entèraksyon prensipal script otorizasyon sa a baze sou redireksyon ant aplikasyon an ak sèvè otorizasyon an. Ou ka li plis sou sibvansyon sa a isit la.

OAuth respekte konsèp ke jeton aksè yo jwenn apre otorizasyon yo ta dwe tanporè epi yo ta dwe chanje, de preferans chak 10 minit an mwayèn. Sibvansyon nan Kòd Otorizasyon se yon verifikasyon twa etap atravè redireksyon, chak 10 minit vire yon etap konsa, franchman, se pa travay ki pi bèl pou je yo. Pou rezoud pwoblèm sa a, gen yon lòt sibvansyon - Refresh Token, ke nou te itilize tou nan peyi nou an. Tout bagay se pi fasil isit la. Pandan verifikasyon ki soti nan yon lòt sibvansyon, anplis siy aksè prensipal la, yo bay yon lòt - Refresh Token, ki ka itilize sèlman yon fwa epi lavi li anjeneral pi long lan. Avèk Refresh Token sa a, lè TTL (Time to Live) nan siy aksè prensipal la fini, demann lan pou yon nouvo siy aksè pral rive nan pwen final yon lòt sibvansyon. Refresh Token yo itilize imedyatman retabli a zewo. Tcheke sa a se de etap epi yo ka fèt nan background nan, enpèrsèptibl itilizatè a.

3) mete sou pye fòma pèsistans yap ogmante jiska done personnalisé

Apre sibvansyon yo chwazi yo aplike, otorizasyon travay, li vo mansyone jwenn done sou itilizatè final la. OIDC gen yon pwen final separe pou sa a, kote ou ka mande done itilizatè ak siy aksè aktyèl ou epi si li ajou. Men, si done itilizatè a pa chanje souvan, epi ou bezwen swiv sa yo kounye a anpil fwa, ou ka vini nan yon solisyon tankou JWT tokens. Tokens sa yo tou sipòte pa estanda a. Siy JWT la li menm gen twa pati: header (enfòmasyon sou siy la), chaj (nenpòt done ki nesesè) ak siyati (siyati, sèvè a siyen jeton epi pita ou ka tcheke sous siyati li).

Nan aplikasyon OIDC, jeton JWT yo rele id_token. Li ka mande ansanm ak yon siy aksè nòmal ak tout sa ki rete se verifye siyati a. Sèvè otorizasyon an gen yon pwen final separe pou sa a ak yon pakèt kle piblik nan fòma a J.W.K.. Epi pale de sa a, li vo mansyone ke gen yon lòt pwen final, ki, ki baze sou estanda a RFC5785 reflete konfigirasyon aktyèl la nan sèvè OIDC la. Li genyen tout adrès pwen final yo (ki gen ladan adrès kle piblik yo itilize pou siyen), mak ak dimansyon ki sipòte, algoritm chifreman yo itilize, sibvansyon sipòte, elatriye.

Pou egzanp sou 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"
 ]
}

Se konsa, lè l sèvi avèk id_token, ou ka transfere tout karakteristik ki nesesè yo nan chaj la nan siy la epi yo pa kontakte sèvè a otorizasyon chak fwa pou mande done itilizatè. Dezavantaj apwòch sa a se ke chanjman nan done itilizatè ki soti nan sèvè a pa vini imedyatman, men ansanm ak yon nouvo jeton aksè.

Rezilta aplikasyon

Se konsa, apre yo fin aplike pwòp sèvè OIDC nou an ak konfigirasyon koneksyon ak li sou bò aplikasyon an, nou rezoud pwoblèm nan transfere enfòmasyon sou itilizatè yo.
Piske OIDC se yon estanda ouvè, nou gen opsyon pou nou chwazi yon founisè ki egziste deja oswa yon aplikasyon sèvè. Nou te eseye Keycloak, ki te tounen trè pratik konfigirasyon, apre yo fin mete kanpe ak chanje konfigirasyon koneksyon sou bò aplikasyon an, li se pare yo ale. Sou bò aplikasyon an, tout sa ki rete se chanje konfigirasyon koneksyon yo.

Pale sou solisyon ki egziste deja

Nan òganizasyon nou an, kòm premye sèvè OIDC, nou te rasanble pwòp aplikasyon nou an, ki te konplete jan sa nesesè. Apre yon revizyon detaye sou lòt solisyon pare yo, nou ka di ke sa a se yon pwen kont. An favè desizyon an aplike sèvè pwòp yo, te gen enkyetid sou pati nan founisè nan absans la nan fonksyonalite ki nesesè yo, osi byen ke prezans nan yon sistèm fin vye granmoun nan ki te gen diferan otorizasyon koutim pou kèk sèvis ak byen anpil. nan done sou anplwaye yo te deja estoke. Sepandan, nan aplikasyon pare yo, gen konvenyans pou entegrasyon. Pou egzanp, Keycloak gen pwòp sistèm jesyon itilizatè li yo ak done yo estoke dirèkteman nan li, epi li pa pral difisil pou rapouswiv itilizatè ou yo la. Pou fè sa, Keycloak gen yon API ki pral pèmèt ou konplètman pote soti nan tout aksyon ki nesesè yo transfè.

Yon lòt egzanp yon sètifye, enteresan, nan opinyon mwen, aplikasyon se Ory Hydra. Li enteresan paske li konsiste de eleman diferan. Pou entegre, w ap bezwen konekte sèvis jesyon itilizatè ou a ak sèvis otorizasyon yo epi pwolonje jan sa nesesè.

Keycloak ak Ory Hydra se pa sèlman solisyon yo ki nan etajè. Li pi bon pou w chwazi yon aplikasyon ki sètifye pa OpenID Foundation. Solisyon sa yo anjeneral gen yon badj Sètifikasyon OpenID.

OpenID Connect: otorizasyon aplikasyon entèn soti nan koutim nan estanda

Epitou pa bliye sou founisè ki deja peye yo si ou pa vle kenbe sèvè OIDC ou a. Jodi a gen anpil bon opsyon.

Ki sa ki nan pwochen an

Nan fiti prè, nou pral fèmen trafik nan sèvis entèn yo nan yon fason diferan. Nou planifye transfere SSO aktyèl nou an sou balans lan lè l sèvi avèk OpenResty nan yon proxy ki baze sou OAuth. Gen deja anpil solisyon pare isit la, pou egzanp:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Lòt materyèl

jwt.io – bon sèvis pou validation tokens JWT
openid.net/developers/certified - lis aplikasyon sètifye OIDC

Sous: www.habr.com

Add nouvo kòmantè