OpenID Connect: ka ʻae ʻana i nā noi kūloko mai ka maʻamau a i ka maʻamau

I kekahi mau mahina i hala aku nei, ke hoʻokō nei au i kahi kikowaena OpenID Connect e hoʻokele i ke komo ʻana no nā haneli o kā mākou noi kūloko. Mai kā mākou hoʻomohala ponoʻī, maʻalahi ma kahi ʻano liʻiliʻi, ua neʻe mākou i kahi maʻamau i ʻae ʻia. ʻO ka loaʻa ʻana ma o ka lawelawe kikowaena e hoʻomaʻamaʻa nui i nā hana monotonous, e hōʻemi i ke kumukūʻai o ka hoʻokō ʻana i nā ʻae, hiki iā ʻoe ke ʻimi i nā hoʻonā i hoʻomākaukau ʻia a ʻaʻole hoʻopaʻa i kou lolo i ka wā e hoʻomohala ai i nā mea hou. Ma kēia ʻatikala, e kamaʻilio wau e pili ana i kēia hoʻololi a me nā puʻupuʻu i hiki iā mākou ke hoʻopiha.

OpenID Connect: ka ʻae ʻana i nā noi kūloko mai ka maʻamau a i ka maʻamau

I ka wā i hala aku nei... Pehea i hoʻomaka ai

I kekahi mau makahiki i hala aku nei, i ka nui o nā noi kūloko no ka hoʻokele lima, ua kākau mākou i kahi noi e hoʻokele i ke komo i loko o ka hui. He polokalamu Rails maʻalahi ia e pili ana i kahi waihona me ka ʻike e pili ana i nā limahana, kahi i hoʻonohonoho ʻia ai ke komo i nā hana like ʻole. I ka manawa like, ua hoʻokiʻekiʻe mākou i ka SSO mua, i hoʻokumu ʻia ma ka hōʻoia ʻana o nā hōʻailona mai ka ʻaoʻao o ka mea kūʻai aku a me ke kikowaena ʻae ʻia, ua hoʻouna ʻia ka hōʻailona ma ke ʻano i hoʻopili ʻia me nā ʻāpana he nui a hōʻoia ʻia ma ka kikowaena mana. ʻAʻole kēia ka koho maʻalahi loa, no ka mea, pono e wehewehe kēlā me kēia noi kūloko i kahi ʻāpana nui o ka loiloi, a ua hoʻonohonoho pono ʻia nā ʻikepili limahana me ka kikowaena mana.

Ma hope o kekahi manawa, ua hoʻoholo mākou e maʻalahi i ka hana o ka mana kikowaena. Ua hoʻoili ʻia ʻo SSO i ka mea kaulike. Me ke kōkua ʻana o OpenResty, ua hoʻohui ʻia kahi mamana iā Lua nāna i nānā i nā hōʻailona, ​​ʻike i ka palapala noi e hele ai ka noi, a hiki ke nānā inā loaʻa ke komo i laila. Ua maʻalahi kēia ala i ka hana o ka mālama ʻana i ke komo ʻana i nā noi kūloko - ma ke code o kēlā me kēia noi, ʻaʻole pono e wehewehe i nā loiloi hou. ʻO ka hopena, ua pani mākou i ke kaʻa ma waho, a ʻaʻole ʻike ka palapala noi i kekahi mea e pili ana i ka ʻae.

Eia naʻe, hoʻokahi pilikia i hoʻopau ʻole ʻia. Pehea e pili ana i nā noi e pono ai ka ʻike e pili ana i nā limahana? Hiki iā ʻoe ke kākau i kahi API no ka lawelawe ʻae, akā pono ʻoe e hoʻohui i nā loiloi hou no kēlā me kēia noi. Eia kekahi, ua makemake mākou e kāpae i ka hilinaʻi ʻana i kekahi o kā mākou mau palapala kākau ponoʻī, i kuhikuhi ʻia i ka wā e hiki mai ana no ka unuhi ʻana i OpenSource, ma kā mākou kikowaena mana kūloko. E kamaʻilio mākou no ia mea i kekahi manawa ʻē aʻe. ʻO ka hopena o nā pilikia ʻelua ʻo OAuth.

i nā kūlana maʻamau

ʻO OAuth kahi maʻamau ʻae ʻae ʻia, akā no ka lawa ʻole o kāna hana, ua hoʻomaka koke lākou e noʻonoʻo iā OpenID Connect (OIDC). ʻO OIDC ponoʻī ke kolu o ka hoʻokō ʻana i ka maʻamau hōʻoia hāmama, i kahe ʻia i kahi mea hoʻohui ma luna o ka protocol OAuth 2.0 (kahi protocol mana wehe). Hoʻopau kēia hoʻonā i ka pilikia o ka nele o ka ʻikepili e pili ana i ka mea hoʻohana hope, a hiki ke hoʻololi i ka mea hāʻawi ʻae.

Akā naʻe, ʻaʻole mākou i koho i kahi mea hoʻolako kikoʻī a hoʻoholo e hoʻohui i ka hoʻohui ʻana me OIDC no kā mākou kikowaena mana ʻae. ʻO ka makemake o kēia hoʻoholo, ʻo ia ka mea maʻalahi loa ʻo OIDC e pili ana i ka mana o ka mea hoʻohana hope. No laila, hiki ke hoʻokō i ke kākoʻo OIDC ma kāu kikowaena mana o kēia manawa.

OpenID Connect: ka ʻae ʻana i nā noi kūloko mai ka maʻamau a i ka maʻamau

ʻO kā mākou ala e hoʻokō ai i kā mākou kikowaena OIDC ponoʻī

1) Lawe i ka ʻikepili i ke ʻano i makemake ʻia

No ka hoʻohui ʻana i ka OIDC, pono e lawe i ka ʻikepili mea hoʻohana i kēia manawa i kahi ʻano i hoʻomaopopo ʻia e ka maʻamau. Ma OIDC kapa ʻia kēia ʻo Claims. ʻO nā koi he mau kahua hope loa i ka waihona mea hoʻohana (inoa, leka uila, kelepona, etc.). Aia papa inoa maʻamau o nā peʻa, a ʻo nā mea a pau ʻaʻole i komo i loko o kēia papa inoa ua manaʻo ʻia he maʻamau. No laila, ʻo ka mea mua e pono ai ʻoe e hoʻolohe inā makemake ʻoe e koho i kahi mea hāʻawi OIDC i kēia manawa ʻo ia ka hiki ke hoʻoponopono maʻalahi i nā hōʻailona hou.

Hoʻohui ʻia ka pūʻulu o nā hiʻohiʻona i loko o kēia subset - Scope. I ka wā ʻae, noi ʻia ke komo ʻana ʻaʻole i nā hōʻailona kikoʻī, akā i nā scopes, ʻoiai inā ʻaʻole pono kekahi o nā hōʻailona mai ka scope.

2) Hoʻokō i nā haʻawina e pono ai

ʻO ka ʻāpana aʻe o ka hoʻohui ʻana o OIDC ke koho a me ka hoʻokō ʻana i nā ʻano ʻae ʻia, nā mea i kapa ʻia ʻo nā haʻawina. ʻO ke ʻano hou o ka launa pū ʻana ma waena o ka noi i koho ʻia a me ke kikowaena ʻae e pili ana i ka hāʻawi i koho ʻia. Hōʻike ʻia kahi papa hoʻohālike no ke koho ʻana i ka hāʻawi kūpono ma ka kiʻi ma lalo nei.

OpenID Connect: ka ʻae ʻana i nā noi kūloko mai ka maʻamau a i ka maʻamau

No kā mākou noi mua, ua hoʻohana mākou i ka hāʻawi maʻamau, ʻo ka Code Authorization. ʻO kona ʻokoʻa mai nā mea ʻē aʻe ʻo ia he ʻekolu-anuʻu, ʻo ia hoʻi. ke hoʻāʻo hou nei. ʻO ka mea mua, hana ka mea hoʻohana i kahi noi no ka ʻae ʻana, loaʻa kahi hōʻailona - Code Authorization, a laila me kēia hōʻailona, ​​me he mea lā me kahi tiketi no ka huakaʻi, noi i kahi hōʻailona komo. Hoʻokumu ʻia ka pilina nui o kēia palapala ʻae i ka hoʻihoʻi ʻana ma waena o ka noi a me ke kikowaena ʻae. Hiki iā ʻoe ke heluhelu hou aʻe e pili ana i kēia haʻawina maanei.

Hoʻopili ʻo OAuth i ka manaʻo ʻo ka loaʻa ʻana o nā hōʻailona ma hope o ka ʻae ʻia he manawa pōkole a hoʻololi maikaʻi i kēlā me kēia 10 mau minuke ma ka awelika. ʻO ka hāʻawi ʻana i ke Code Authorization he hōʻoia ʻekolu mau ʻanuʻu ma o ka hoʻihoʻi ʻana, i kēlā me kēia 10 mau minuke e hoʻohuli i kēlā ʻanuʻu, ʻoiaʻiʻo, ʻaʻole ia ka hana ʻoluʻolu loa no nā maka. No ka hoʻoponopono ʻana i kēia pilikia, aia kekahi hāʻawi - Refresh Token, a mākou i hoʻohana ai i ko mākou ʻāina. Ua maʻalahi nā mea a pau maʻaneʻi. I ka hōʻoia ʻana mai kahi haʻawina ʻē aʻe, ma kahi o ka hōʻailona komo nui, ua hoʻopuka ʻia kekahi - Refresh Token, hiki ke hoʻohana hoʻokahi wale nō a ʻoi aku ka lōʻihi o kona ola ʻana. Me kēia Refresh Token, i ka wā e pau ai ka TTL (Time to Live) o ka hōʻailona komo nui, e hele mai ka noi no kahi hōʻailona komo hou i ka hopena o kahi hāʻawi. Hoʻihoʻi koke ʻia ka Refresh Token i ʻole. He ʻelua ʻanuʻu kēia nānā a hiki ke hana ʻia ma hope, me ka ʻike ʻole ʻia e ka mea hoʻohana.

3) Hoʻonohonoho i nā ʻano hoʻopuka puka ʻikepili maʻamau

Ma hope o ka hoʻokō ʻia ʻana o nā hāʻawi i koho ʻia, hana ka ʻae ʻana, pono e haʻi ʻia ka loaʻa ʻana o ka ʻikepili e pili ana i ka mea hoʻohana hope. Loaʻa i ka OIDC kahi hopena ʻokoʻa no kēia, kahi e hiki ai iā ʻoe ke noi i ka ʻikepili mea hoʻohana me kāu hōʻailona komo i kēia manawa a inā he mea hou. A inā ʻaʻole loli pinepine ka ʻikepili o ka mea hoʻohana, a pono ʻoe e hahai i nā mea i kēia manawa i nā manawa he nui, hiki iā ʻoe ke hele mai i kahi hopena e like me nā hōʻailona JWT. Kākoʻo ʻia kēia mau hōʻailona e ka maʻamau. ʻO ka hōʻailona JWT ponoʻī he ʻekolu mau ʻāpana: ke poʻo (ka ʻike e pili ana i ka hōʻailona), ka uku (kekahi ʻikepili pono) a me ka pūlima (hōʻailona, ​​ua kau inoa ʻia ka hōʻailona e ke kikowaena a hiki iā ʻoe ke nānā i ke kumu o kāna pūlima).

I ka hoʻokō OIDC, ua kapa ʻia ka hōʻailona JWT id_token. Hiki ke noi ʻia me kahi hōʻailona komo maʻamau a ʻo ka mea i koe e hōʻoia i ka pūlima. He ʻokoʻa ka ʻokoʻa o ke kikowaena ʻae no kēia me ka pūʻulu o nā kī lehulehu i ke ʻano Ua hoike mai o J.W.K.. A e kamaʻilio e pili ana i kēia, pono e haʻi ʻia aia kekahi hopena ʻē aʻe, e pili ana i ka maʻamau RFC5785 hōʻike i ka hoʻonohonoho o kēia manawa o ke kikowaena OIDC. Loaʻa iā ia nā helu helu hope a pau (me ka helu o ke apo kī lehulehu i hoʻohana ʻia no ka hoʻopaʻa inoa ʻana), nā hōʻailona kākoʻo a me nā scopes, nā algorithm hoʻopunipuni i hoʻohana ʻia, nā haʻawina kākoʻo, etc.

No ka laʻana ma 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"
 ]
}

No laila, me ka hoʻohana ʻana i id_token, hiki iā ʻoe ke hoʻololi i nā hiʻohiʻona pono āpau i ka uku o ka hōʻailona a ʻaʻole e hoʻopili i ka kikowaena mana i kēlā me kēia manawa e noi i ka ʻikepili mea hoʻohana. ʻO ka hemahema o kēia ala, ʻo ka hoʻololi ʻana i ka ʻikepili mea hoʻohana mai ke kikowaena ʻaʻole hiki koke mai, akā me kahi hōʻailona komo hou.

Nā hopena hoʻokō

No laila, ma hope o ka hoʻokō ʻana i kā mākou kikowaena OIDC ponoʻī a me ka hoʻonohonoho ʻana i nā pilina iā ia ma ka ʻaoʻao noi, ua hoʻoponopono mākou i ka pilikia o ka hoʻoili ʻana i ka ʻike e pili ana i nā mea hoʻohana.
No ka mea ʻo OIDC kahi maʻamau ākea, loaʻa iā mākou ke koho o ke koho ʻana i kahi mea hoʻolako a i ʻole hoʻokō server. Ua ho'āʻo mākou iā Keycloak, i lilo i mea maʻalahi loa e hoʻonohonoho, ma hope o ka hoʻonohonoho ʻana a me ka hoʻololi ʻana i nā hoʻonohonoho pili ma ka ʻaoʻao noi, ua mākaukau e hele. Ma ka ʻaoʻao noi, ʻo nā mea a pau i koe e hoʻololi i nā hoʻonohonoho pili.

E kamaʻilio e pili ana i nā hoʻonā e kū nei

I loko o kā mākou hui, ma ke ʻano he kikowaena OIDC mua, ua hōʻuluʻulu mākou i kā mākou hoʻokō ponoʻī, i hoʻohui ʻia e like me ka mea e pono ai. Ma hope o ka loiloi kikoʻī o nā hoʻonā i hoʻomākaukau ʻia, hiki iā mākou ke ʻōlelo he moot point kēia. No ka hoʻoholo ʻana e hoʻokō i kā lākou kikowaena ponoʻī, aia nā hopohopo ma ka ʻaoʻao o nā mea hoʻolako i ka nele o ka hana e pono ai, a me ka hele ʻana o kahi ʻōnaehana kahiko i loaʻa nā mana maʻamau no kekahi mau lawelawe a he nui loa. o ka ʻikepili e pili ana i nā limahana ua mālama ʻia. Eia nō naʻe, i nā hoʻokō mākaukau, aia nā ʻoluʻolu no ka hoʻohui. No ka laʻana, aia ʻo Keycloak i kāna ʻōnaehana hoʻohana ponoʻī a mālama pono ʻia ka ʻikepili i loko, a ʻaʻole paʻakikī ke hopu i kāu mea hoʻohana ma laila. No ka hana ʻana i kēia, loaʻa iā Keycloak kahi API e hiki ai iā ʻoe ke hoʻokō piha i nā hana hoʻoili pono a pau.

ʻO kekahi hiʻohiʻona o kahi hōʻoia, hoihoi, i koʻu manaʻo, hoʻokō ʻo Ory Hydra. He mea hoihoi ia no ka mea aia nā ʻāpana like ʻole. No ka hoʻohui ʻana, pono ʻoe e hoʻopili i kāu lawelawe hoʻokele mea hoʻohana i kā lākou lawelawe ʻae a hoʻonui e like me ka mea e pono ai.

ʻAʻole ʻo Keycloak a me Ory Hydra wale nō ka hopena o waho. ʻOi aku ka maikaʻi e koho i kahi hoʻokō i hōʻoia ʻia e ka OpenID Foundation. Loaʻa i kēia mau hoʻonā ka hōʻailona OpenID Certification.

OpenID Connect: ka ʻae ʻana i nā noi kūloko mai ka maʻamau a i ka maʻamau

Mai poina e pili ana i nā mea hoʻolako uku inā ʻaʻole ʻoe makemake e mālama i kāu kikowaena OIDC. I kēia lā, nui nā koho maikaʻi.

He aha ka mea aʻe

I ka wā e hiki mai ana, e pani mākou i nā kaʻa i nā lawelawe kūloko ma kahi ʻano ʻokoʻa. Hoʻolālā mākou e hoʻololi i kā mākou SSO o kēia manawa ma ka mea kaulike me ka hoʻohana ʻana iā OpenResty i kahi koho ma muli o OAuth. Nui nā ʻano hoʻonā i hoʻomākaukau ʻia ma ʻaneʻi, no ka laʻana:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Nā mea hana hou aʻe

jwt.io - lawelawe maikaʻi no ka hōʻoia ʻana i nā hōʻailona JWT
openid.net/developers/certified - papa inoa o nā hoʻokō OIDC i hōʻoia ʻia

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka