• oauth
  • jwt
  • api
  • turvallisuus
  • autentikointi
  • valtuutus
  • koneiden välinen

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.

Gao
Gao
Founder

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
  • Maksupalvelu, joka tarjoaa API:ja maksujen käsittelyyn
    • Päätepiste: https://payment.example.com/api

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 on application/x-www-form-urlencoded.
  • Authorization-otsikkoa varten arvo on Basic <base64(app_id:app_secret)>, missä app_id ja app_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.

  1. Syötä checkout roolin nimeksi ja syötä Checkout-palvelu roolin kuvaukseksi.
  2. Napsauta Näytä lisää vaihtoehtoja. Valitse "Koneiden välinen sovellusrooli" roolityypiksi.
  3. "Annetut luvat" -osiossa napsauta nuolikuvaketta API-resurssin nimen (Maksupalvelu) vasemmalla puolella ja valitse write:payment oikeus.
    Luo rooli
  4. Napsauta Luo rooli.
  5. 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.
Määritä rooli sovellukselle

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.