Suojaa API-resurssisi koneiden väliselle viestinnälle
Opi hyödyntämään OAuth 2.0 ja JWT suojaamaan API-resurssisi koneiden väliselle viestinnälle.
Kun rakennetaan projektia, joka sisältää useita palveluita, API-resurssien turvallisuus on kriittinen asia. Tässä artikkelissa näytän, kuinka voit hyödyntää OAuth 2.0 ja JWT suojaamaan viestintää palveluiden (koneiden välinen) välillä, ja kuinka soveltaa roolipohjaista pääsynhallintaa (RBAC) noudattaaksesi vähimmäisoikeusperiaatetta.
Aloita
Jotta voit seurata mukana, oletan, että sinulla on seuraavat edellytykset:
- Logto Cloud -tili tai itse isännöity Logto-instanssi
- Vähintään kaksi palvelua, jotka tarvitsevat toisiaan kommunikoida
Esimerkkinä oletetaan, että meillä on seuraavat palvelut:
- Ostoskoripalvelu, joka tarjoaa API:ja hallinnoimaan ostoskoreja
- Päätepiste:
https://cart.example.com/api
- Päätepiste:
- Maksupalvelu, joka tarjoaa API:ja maksujen käsittelyyn
- Päätepiste:
https://payment.example.com/api
- Päätepiste:
Autentikointivirta
Nyt meidän ostoskoripalvelumme täytyy soittaa maksupalveluun käsitelläkseen maksuja. Autentikointivirta on seuraava:
Joihinkin keskeisiin käsitteisiin yllä olevassa kaaviossa kuuluu:
- JWT (RFC 7519): JSON-verkkotunnus. Katso meidän edellinen artikkeli johdannosta JWT:hen.
- JWK (RFC 7517): JSON-verkkotunnusavainta käytetään JWT:n allekirjoituksen vahvistamiseen. JWK-joukko on joukko JWK:ita.
- "client_credentials" myöntö (RFC 6749): Myöntötyyppi OAuth 2.0:ssa. Se käyttää asiakkaan tunnistetietoja saadakseen pääsytunnuksen. Demonstroimme yksityiskohtia tulevissa osioissa.
Jokaisella osallistujalla yllä olevassa kaaviossa on rooli autentikointivirrassa:
- Ostoskoripalvelu: Asiakas, joka tarvitsee soittaa maksupalveluun. Vaikka se on palvelu, se on silti asiakas OAuth 2.0 -kontekstissa, ja kutsumme näitä asiakkaita "koneiden välisiksi sovelluksiksi" Logtossa.
- Logto: OAuth 2.0 -valtuutuspalvelin, joka myöntää pääsytunnuksia.
- Maksupalvelu: API-resurssi, joka tarjoaa API:ja maksujen käsittelemiseen.
Käydään läpi autentikointivirta askel askeleelta.
Alkuperäinen asennus
Autentikointivirran suorittamiseksi meidän täytyy luoda koneiden välinen sovellus (ostoskoripalvelu) ja API-resurssi (maksupalvelu) Logtossa.
Luo API-resurssi
Koska meidän ostoskoripalvelumme täytyy olla tietoinen maksupalvelun API:sta suorittaessaan autentikointia, meidän täytyy luoda API-resurssi ensin. Mene Logto-konsoliin, napsauta API-resurssit vasemmanpuoleisessa sivupalkissa ja napsauta Luo API-resurssi. Avautuneessa ikkunassa tarjoamme joitain opetusohjelmia auttamaan sinua pääsemään alkuun. Voit myös napsauttaa Jatka ilman opetusohjelmaa ohittaaksesi sen.
Syötä API:n nimi ja tunniste, esimerkiksi, Maksupalvelu
ja https://payment.example.com/api
, ja napsauta sitten Luo API-resurssi.
API-resurssin luomisen jälkeen sinut ohjataan yksityiskohtaiselle sivulle. Voimme jättää sen tällä hetkellä sellaiseksi kuin se on.
Luo koneiden välinen sovellus
Napsauta Sovellukset vasemmanpuoleisessa sivupalkissa ja napsauta Luo sovellus. Avautuneessa ikkunassa löydä Koneiden välinen kortti, ja napsauta sitten Aloita rakentaminen.
Syötä sovelluksen nimi, esimerkiksi, Ostoskoripalvelu
, ja napsauta Luo sovellus. Sinulle näytetään vuorovaikutteinen opas auttamaan sinua sovelluksen asennuksessa. Voit noudattaa opasta ymmärtääksesi peruskäytön tai napsauttaa Valmis ja valmis ohittaaksesi sen.
Pyydä pääsytunnus
Koska koneiden v älisten sovellusten oletetaan olevan turvallisia (esim., ne sijoitetaan yksityiseen verkkoon), voimme käyttää OAuth 2.0 "client_credentials"-valtuutusta saadaksemme pääsytunnuksen. Se käyttää perusautentikointia asiakkaan tunnistamiseen:
- Pyynnön URL-osoite on Logto-instanssisi tunnispääte. Voit löytää ja kopioida sen koneiden välisen sovelluksen yksityiskohtaisen sivun Lisäasetukset-välilehdeltä.
- Pyynnön menetelmä on
POST
. - Pyynnön
Content-Type
-otsikko onapplication/x-www-form-urlencoded
. Authorization
-otsikkoa varten arvo onBasic <base64(app_id:app_secret)>
, missäapp_id
jaapp_secret
ovat koneiden välisen sovelluksen sovellustunnus ja sovellussalaisuus. Voit löytää ne sovelluksen yksityiskohtaiselta sivulta.- Pyynnön runko täytyy määrittää myöntötyypin ja API-tunnisteen. Esimerkiksi,
grant_type=client_credentials&resource=https://payment.example.com/api
.grant_type=client_credentials
: Vakioarvo "client_credentials" myönnölle.resource=https://payment.example.com/api
: API-resurssin API-tunniste, johon asiakas haluaa päästä.- Jos sovellus täytyy valtuuttaa laajuuksilla (luvat), voit myös määrittää laajuudet pyynnön rungossa. Esimerkiksi,
scope=read:payment write:payment
. Käsitellään laajuuksia myöhemmin.
Tässä on esimerkki pyynnöstä curl
:lla:
Onnistunut vastausrunkorakenne voisi olla seuraava:
Lähetä pyyntö valtuutuspääotsikolla
Nyt meillä on pääsytunnus, ja voimme lisätä sen API-resurssin pyynnön Authorization
-pääotsikkoon. Esimerkiksi, jos haluamme kutsua maksupalvelun POST /payments
API:a, voimme lähettää seuraavan pyynnön:
Vahvista JWT
Saatat huomata, että maksupalvelun täytyy vahvistaa JWT JWK-joukon avulla, ja sillä saattaa olla paikallinen JWK-joukon välimuisti välttääkseen JWK-joukon saamista Logtosta jokaisella kerralla. Onneksi JWT:n suosion vuoksi on olemassa monia kirjastoja, jotka voivat auttaa sinua saavuttamaan tämän muutamilla koodiriveillä.
Näitä kirjastoja kutsutaan yleensä "jose" (JavaScript Object Signing and Encryption) tai "jsonwebtoken". Esimerkiksi Node.js:ssä voimme käyttää jose vahvistamaan JWT:
Jos vahvistus onnistuu, payload
-muuttuja on dekoodattu JWT-taulu. Muussa tapauksessa tapahtuu virhe.
Sovella roolipohjaista pääsynhallintaa
Nyt olemme onnistuneesti suojanneet viestinnän ostoskoripalvelun ja maksupalvelun välillä. Kuitenkin autentikointivirta vain varmistaa, että asiakas on todellinen ostoskoripalvelu, mutta ei varmistaa, että ostoskoripalvelulla on lupa suorittaa toimintoja maksupalvelussa.
Sanotaan, että haluamme sallia ostoskoripalvelun luoda maksuja, mutta ei lukea maksuja.
Määritä oikeudet
Logtossa "laajuuksia" ja "oikeuksia" käytet ään keskenään vaihdettavasti. Mene maksupalvelun API-resurssin tiedot -sivulle ja siirry Luvat-välilehdelle. Sen pitäisi olla nyt tyhjä. Napsauta Luo lupa, syötä read:payment
oikeusnimeksi ja syötä Lue maksut
luvan kuvaukseksi. Napsauta sitten Luo lupa.
Toista yllä olevat vaiheet toisen luvan luomiseksi nimellä write:payment
ja kuvauksella Luo maksuja
.
Luo koneiden välinen rooli
Rooli on ryhmä oikeuksia. Logtossa koneiden välisille sovelluksille voidaan antaa rooleja myöntääkseen oikeuksia. Napsauta "Roolit" vasemmanpuoleisessa sivupalkissa ja napsauta Luo rooli.
- Syötä
checkout
roolin nimeksi ja syötäCheckout-palvelu
roolin kuvaukseksi. - Napsauta Näytä lisää vaihtoehtoja. Valitse "Koneiden välinen sovellusrooli" roolityypiksi.
- "Annetut luvat" -osiossa napsauta nuolikuvaketta API-resurssin nimen (Maksupalvelu) vasemmalla puolella ja valitse
write:payment
oikeus. - Napsauta Luo rooli.
- Koska meillä on jo koneiden välinen sovellus (Ostoskoripalvelu), voimme suoraan antaa roolin sille seuraavassa vaiheessa. Valitse sovelluksen nimen (Ostoskoripalvelu) vasemmalla oleva valintaruutu ja napsauta Määritä sovellukset.
Pyydä pääsytunnusta laajuuksineen
Sen lisäksi mitä mainitsimme Pyydä pääsytunnus -kohdassa mainituista pyynnön rungon parametreista, voimme myös määrittää laajuudet pyynnön rungossa. Esimerkiksi, jos haluamme pyytää write:payment
oikeuden, voimme lähettää seuraavan pyynnön:
Pyytääkseen useita laajuuksia, voit erottaa ne välilyönnillä. Esimerkiksi, scope=write:payment read:payment
.
Vahvista laajuudet
Jos toiminto tarvitsee write:payment
oikeuden maksupalvelussa, voimme vahvistaa laajuudet varmistamalla, että JWT-sisutuksen scope
-väittämä sisältää:
Yhteenveto
Jos haluat suojata pääsyä ostoskoripalveluun, voit myös soveltaa samaa autentikointivirtaa. Tällä kertaa ostoskoripalvelu on API-resurssi, ja asiakas on toinen palvelu, joka tarvitsee päästä siihen.
Logton avulla API-resurssisi ovat suojattu OAuth 2.0:lla ja JWT:llä, ja voit noudattaa vähimmäisoikeusperiaatetta soveltamalla roolipohjaista pääsynhallintaa. Lisäksi voit käyttää Logtoa hallinnoimaan käyttäjiäsi ja heidän lupiaan, ja jopa integroitumaan kolmannen osapuolen identiteetin tarjoajien kanssa.