OpenID Sopọ: ašẹ ti awọn ohun elo inu lati aṣa si boṣewa

Ni oṣu diẹ sẹhin, Mo n ṣe imuse olupin OpenID Connect lati ṣakoso iraye si fun awọn ọgọọgọrun awọn ohun elo inu wa. Lati awọn idagbasoke tiwa, irọrun lori iwọn kekere, a ti gbe si boṣewa ti o gba gbogbogbo. Wiwọle nipasẹ iṣẹ aarin jẹ irọrun awọn iṣẹ monotonous pupọ, dinku idiyele ti imuse awọn aṣẹ, gba ọ laaye lati wa ọpọlọpọ awọn solusan ti a ti ṣetan ati kii ṣe agbeko awọn ọpọlọ rẹ nigbati o ndagbasoke awọn tuntun. Ninu nkan yii, Emi yoo sọrọ nipa iyipada yii ati awọn bumps ti a ṣakoso lati kun.

OpenID Sopọ: ašẹ ti awọn ohun elo inu lati aṣa si boṣewa

Igba pipẹ seyin... Bawo ni gbogbo rẹ ti bẹrẹ

Ni ọdun diẹ sẹhin, nigbati ọpọlọpọ awọn ohun elo inu wa fun iṣakoso afọwọṣe, a kọ ohun elo kan lati ṣakoso wiwọle laarin ile-iṣẹ naa. O jẹ ohun elo Rails ti o rọrun ti o sopọ si data data pẹlu alaye nipa awọn oṣiṣẹ, nibiti a ti tunto iraye si awọn iṣẹ ṣiṣe lọpọlọpọ. Ni akoko kanna, a gbe SSO akọkọ soke, eyiti o da lori iṣeduro awọn ami-ami lati ẹgbẹ ti alabara ati olupin aṣẹ, ami naa ti gbejade ni fọọmu ti paroko pẹlu ọpọlọpọ awọn aye ati rii daju lori olupin aṣẹ. Eyi kii ṣe aṣayan ti o rọrun julọ, nitori pe ohun elo inu kọọkan ni lati ṣapejuwe ipele ti oye kan, ati pe awọn apoti isura infomesonu oṣiṣẹ ti ṣiṣẹpọ patapata pẹlu olupin aṣẹ.

Lẹhin akoko diẹ, a pinnu lati ṣe irọrun iṣẹ-ṣiṣe ti aṣẹ aarin. SSO ti gbe lọ si iwọntunwọnsi. Pẹ̀lú ìrànlọ́wọ́ OpenResty, a ṣàfikún àdàkọ kan sí Lua tí ó ṣàyẹ̀wò àwọn àmì, mọ ohun èlò tí ìbéèrè náà ń lọ, ó sì lè yẹ̀ bóyá iwọle wà níbẹ̀. Ọna yii jẹ irọrun pupọ iṣẹ ṣiṣe ti iṣakoso iraye si awọn ohun elo inu - ninu koodu ohun elo kọọkan, ko ṣe pataki lati ṣapejuwe ọgbọn afikun mọ. Bi abajade, a ti pa ijabọ naa ni ita, ati pe ohun elo funrararẹ ko mọ ohunkohun nipa aṣẹ.

Sibẹsibẹ, iṣoro kan ko yanju. Kini nipa awọn ohun elo ti o nilo alaye nipa awọn oṣiṣẹ? O ṣee ṣe lati kọ API kan fun iṣẹ igbanilaaye, ṣugbọn lẹhinna o yoo ni lati ṣafikun ọgbọn afikun fun iru ohun elo kọọkan. Ni afikun, a fẹ lati yọkuro igbẹkẹle lori ọkan ninu awọn ohun elo ti a kọ ti ara ẹni, ti o ni iṣalaye ni ọjọ iwaju fun itumọ si OpenSource, lori olupin aṣẹ inu inu wa. A yoo sọrọ nipa rẹ diẹ ninu awọn akoko miiran. Ojutu si awọn iṣoro mejeeji jẹ OAuth.

to wọpọ awọn ajohunše

OAuth jẹ agbọye, boṣewa gbigba aṣẹ ni gbogbogbo, ṣugbọn nitori pe iṣẹ ṣiṣe nikan ko to, lẹsẹkẹsẹ wọn bẹrẹ lati gbero OpenID Connect (OIDC). OIDC funrararẹ jẹ imuse kẹta ti boṣewa ijẹrisi ṣiṣi, eyiti o ti ṣan sinu afikun lori ilana OAuth 2.0 (ilana aṣẹ ṣiṣi). Ojutu yii tilekun iṣoro ti aini data nipa olumulo ipari, ati tun jẹ ki o ṣee ṣe lati yi olupese aṣẹ pada.

Sibẹsibẹ, a ko yan olupese kan pato ati pinnu lati ṣafikun iṣọpọ pẹlu OIDC fun olupin aṣẹ ti o wa tẹlẹ. Ni ojurere ti ipinnu yii ni otitọ pe OIDC rọ pupọ ni awọn ofin ti aṣẹ olumulo ipari. Nitorinaa, o ṣee ṣe lati ṣe atilẹyin OIDC lori olupin aṣẹ lọwọlọwọ rẹ.

OpenID Sopọ: ašẹ ti awọn ohun elo inu lati aṣa si boṣewa

Ọna wa ti imuse olupin OIDC tiwa

1) Mu data wa si fọọmu ti o fẹ

Lati ṣepọ OIDC, o jẹ dandan lati mu data olumulo lọwọlọwọ wa sinu fọọmu ti oye nipasẹ boṣewa. Ni OIDC eyi ni a npe ni Claims. Awọn ẹtọ jẹ awọn aaye ti o kẹhin ni pataki ni aaye data olumulo (orukọ, imeeli, foonu, ati bẹbẹ lọ). O wa boṣewa akojọ ti awọn ontẹ, ati ohun gbogbo ti ko ba wa ninu akojọ yii ni a kà si aṣa. Nitorinaa, aaye akọkọ ti o nilo lati fiyesi si ti o ba fẹ yan olupese OIDC ti o wa tẹlẹ ni iṣeeṣe ti isọdi irọrun ti awọn ami iyasọtọ tuntun.

Ẹgbẹ ti awọn ami iyasọtọ ti wa ni idapo sinu ipin atẹle wọnyi - Dopin. Lakoko aṣẹ, iraye si kii ṣe si awọn ami iyasọtọ kan pato, ṣugbọn si awọn iwọn, paapaa ti diẹ ninu awọn ami iyasọtọ ti iwọn ko ba nilo.

2) Ṣiṣe awọn ifunni pataki

Apakan atẹle ti iṣọpọ OIDC ni yiyan ati imuse ti awọn iru aṣẹ, eyiti a pe ni awọn ifunni. Oju iṣẹlẹ siwaju sii ti ibaraenisepo laarin ohun elo ti o yan ati olupin aṣẹ yoo dale lori ẹbun ti o yan. Eto apẹẹrẹ fun yiyan ẹbun ti o tọ ni a fihan ni nọmba ni isalẹ.

OpenID Sopọ: ašẹ ti awọn ohun elo inu lati aṣa si boṣewa

Fun ohun elo akọkọ wa, a lo ẹbun ti o wọpọ julọ, koodu Aṣẹ. Iyatọ rẹ lati awọn miiran ni pe o jẹ igbesẹ mẹta, i.e. ti wa ni kqja afikun igbeyewo. Ni akọkọ, olumulo ṣe ibeere fun igbanilaaye iwe-aṣẹ, gba ami-ami - koodu Aṣẹ, lẹhinna pẹlu ami ami yii, bi ẹnipe pẹlu tikẹti fun irin-ajo, beere ami ami iwọle. Gbogbo ibaraenisepo akọkọ ti iwe afọwọkọ aṣẹ yii da lori awọn àtúnjúwe laarin ohun elo ati olupin aṣẹ. O le ka diẹ sii nipa ẹbun yii nibi.

OAuth faramọ imọran pe awọn ami wiwọle ti o gba lẹhin aṣẹ yẹ ki o jẹ igba diẹ ati pe o yẹ ki o yipada, ni pataki ni gbogbo iṣẹju mẹwa 10 ni apapọ. Ẹbun koodu Iwe-aṣẹ jẹ ijẹrisi-igbesẹ mẹta nipasẹ awọn àtúnjúwe, ni gbogbo iṣẹju mẹwa 10 lati yi iru igbesẹ kan, ni otitọ, kii ṣe iṣẹ ti o dun julọ fun awọn oju. Lati yanju iṣoro yii, ẹbun miiran wa - Refresh Token, eyiti a tun lo ni orilẹ-ede wa. Ohun gbogbo rọrun nibi. Lakoko ijẹrisi lati ẹbun miiran, ni afikun si ami iwọle akọkọ, ọkan miiran ni a fun ni - Refresh Token, eyiti o le ṣee lo ni ẹẹkan ati igbesi aye rẹ nigbagbogbo gun pupọ. Pẹlu Tokini Imularada yii, nigbati TTL (Aago lati gbe) ti ami ami iwọle akọkọ ba pari, ibeere fun ami-iwọle iwọle tuntun yoo wa si aaye ipari ti ẹbun miiran. Aami Itura ti a lo ti jẹ atunto lẹsẹkẹsẹ si odo. Ayẹwo yii jẹ igbesẹ meji ati pe o le ṣee ṣe ni abẹlẹ, lai ṣe akiyesi olumulo.

3) Ṣeto awọn ọna kika o wu data aṣa

Lẹhin ti awọn ifunni ti o yan ti wa ni imuse, awọn iṣẹ aṣẹ, o tọ lati darukọ gbigba data nipa olumulo ipari. OIDC ni aaye ipari lọtọ fun eyi, nibi ti o ti le beere data olumulo pẹlu ami wiwọle iwọle lọwọlọwọ rẹ ati ti o ba wa titi di oni. Ati pe ti data olumulo ko ba yipada nigbagbogbo, ati pe o nilo lati tẹle awọn ti o wa lọwọlọwọ ni ọpọlọpọ igba, o le wa si iru ojutu bi awọn ami JWT. Awọn ami wọnyi tun ṣe atilẹyin nipasẹ boṣewa. Àmi JWT funrararẹ ni awọn ẹya mẹta: akọsori (alaye nipa ami ami), fifuye isanwo (eyikeyi data pataki) ati ibuwọlu (Ibuwọlu, ami naa ti fowo si nipasẹ olupin ati lẹhinna o le ṣayẹwo orisun ti Ibuwọlu rẹ).

Ninu imuse OIDC, ami JWT ni a pe ni id_token. O le beere pẹlu ami iraye si deede ati gbogbo ohun ti o ku ni lati jẹrisi ibuwọlu naa. Olupin aṣẹ ni aaye ipari lọtọ fun eyi pẹlu opo awọn bọtini gbangba ni ọna kika J.W.K.. Ati sisọ nipa eyi, o tọ lati darukọ pe aaye ipari miiran wa, eyiti, da lori boṣewa RFC5785 ṣe afihan iṣeto lọwọlọwọ ti olupin OIDC. O ni gbogbo awọn adirẹsi ipari (pẹlu adirẹsi ti oruka bọtini gbangba ti a lo fun wíwọlé), awọn ami iyasọtọ ti o ni atilẹyin ati awọn iwọn, awọn algoridimu fifi ẹnọ kọ nkan, awọn ifunni atilẹyin, ati bẹbẹ lọ.

Fun apẹẹrẹ lori 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"
 ]
}

Nitorinaa, ni lilo id_token, o le gbe gbogbo awọn ami iyasọtọ pataki si isanwo ti ami naa ati pe ko kan si olupin aṣẹ ni akoko kọọkan lati beere data olumulo. Awọn aila-nfani ti ọna yii ni pe iyipada ninu data olumulo lati ọdọ olupin ko wa lẹsẹkẹsẹ, ṣugbọn pẹlu ami ami wiwọle tuntun.

Awọn abajade imuse

Nitorinaa, lẹhin imuse olupin OIDC tiwa ati atunto awọn asopọ si rẹ ni ẹgbẹ ohun elo, a yanju iṣoro ti gbigbe alaye nipa awọn olumulo.
Niwọn bi OIDC jẹ boṣewa ṣiṣi, a ni aṣayan ti yiyan olupese ti o wa tabi imuse olupin. A gbiyanju Keycloak, eyiti o jẹ irọrun pupọ lati tunto, lẹhin ti o ṣeto ati iyipada awọn atunto asopọ ni ẹgbẹ ohun elo, o ti ṣetan lati lọ. Ni ẹgbẹ ohun elo, gbogbo ohun ti o ku ni lati yi awọn atunto asopọ pada.

Sọrọ nipa awọn solusan ti o wa tẹlẹ

Laarin ajo wa, gẹgẹbi olupin OIDC akọkọ, a kojọpọ imuse ti ara wa, eyiti a ṣe afikun bi o ṣe pataki. Lẹhin atunyẹwo alaye ti awọn solusan miiran ti a ti ṣetan, a le sọ pe eyi jẹ aaye moot. Ni ojurere ti ipinnu lati ṣe imuse olupin tiwọn, awọn ifiyesi wa ni apakan ti awọn olupese ni isansa ti iṣẹ ṣiṣe to wulo, ati wiwa ti eto atijọ kan ninu eyiti awọn aṣẹ aṣa oriṣiriṣi wa fun diẹ ninu awọn iṣẹ ati pupọ pupọ. ti data nipa awọn oṣiṣẹ ti wa ni ipamọ tẹlẹ. Sibẹsibẹ, ni awọn imuse ti a ti ṣetan, awọn irọrun wa fun iṣọpọ. Fun apẹẹrẹ, Keycloak ni eto iṣakoso olumulo tirẹ ati pe data wa ni ipamọ taara ninu rẹ, ati pe kii yoo nira lati bori awọn olumulo rẹ nibẹ. Lati ṣe eyi, Keycloak ni API ti yoo gba ọ laaye lati ṣe ni kikun gbogbo awọn iṣe gbigbe pataki.

Apeere miiran ti ifọwọsi, ti o nifẹ, ninu ero mi, imuse jẹ Ory Hydra. O ti wa ni awon nitori ti o oriširiši ti o yatọ si irinše. Lati ṣepọ, iwọ yoo nilo lati sopọ iṣẹ iṣakoso olumulo rẹ si iṣẹ aṣẹ wọn ati fa siwaju bi o ti nilo.

Keycloak ati Ory Hydra kii ṣe awọn solusan ita-selifu nikan. O dara julọ lati yan imuse ti ifọwọsi nipasẹ OpenID Foundation. Awọn ojutu wọnyi nigbagbogbo ni baaji Ijẹrisi OpenID kan.

OpenID Sopọ: ašẹ ti awọn ohun elo inu lati aṣa si boṣewa

Tun maṣe gbagbe nipa awọn olupese ti o sanwo ti o wa ti o ko ba fẹ lati tọju olupin OIDC rẹ. Loni ọpọlọpọ awọn aṣayan ti o dara wa.

Kini atẹle

Ni ọjọ iwaju ti o sunmọ, a yoo pa ijabọ si awọn iṣẹ inu ni ọna ti o yatọ. A gbero lati gbe SSO lọwọlọwọ wa lori iwọntunwọnsi nipa lilo OpenResty si aṣoju ti o da lori OAuth. Ọpọlọpọ awọn solusan ti a ti ṣetan tẹlẹ wa nibi, fun apẹẹrẹ:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Awọn ohun elo afikun

jwt.io - ti o dara iṣẹ fun a validating JWT àmi
openid.net/developers/certified - akojọ ti awọn imuse OIDC ifọwọsi

orisun: www.habr.com

Fi ọrọìwòye kun