OAuth ile API'nin güvenliğini sağlama

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Neler öğreneceksiniz?

  • Örnek bir API proxy'si indirip dağıtın.
  • OAuth korumalı bir API proxy'si oluşturun.
  • Ürün, geliştirici ve uygulama oluşturun.
  • Bir OAuth erişim jetonu için kimlik bilgilerini takas edin.
  • Erişim jetonu olan bir API'yi çağırın.

Bu eğitim, OAuth 2.0 kullanarak bir API'nin güvenliğini nasıl sağlayacağınızı gösterir.

OAuth, kullanıcıların kullanıcı adlarını ve şifrelerini belirtmelerine gerek kalmadan uygulamaların kullanıcılar adına bilgilere erişmesini sağlayan bir yetkilendirme protokolüdür.

OAuth ile güvenlik kimlik bilgileri (ör. kullanıcı adı/şifre veya anahtar/sır) erişim jetonu olarak değiştirilir. Örneğin:

joe:joes_password (kullanıcı adı:şifre) veya
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:gizli)

şöyle bir şeye dönüşür:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Erişim jetonu, rastgele bir karakter dizesidir ve geçicidir (nispeten kısa bir süre sonra süresinin sona ermesi gerekir). Bu nedenle, uygulama iş akışında kullanıcının kimliğini doğrulamak için jetonun iletilmesi, gerçek kimlik bilgilerinin yeni bir kısmını iletmekten çok daha güvenlidir.

OAuth 2.0 spesifikasyonu, uygulamalar için erişim jetonları dağıtmak üzere "izin türleri" adı verilen farklı mekanizmalar tanımlar. OAuth 2.0 tarafından tanımlanan en temel izin türü "istemci kimlik bilgileri" olarak adlandırılır. Bu izin türünde OAuth erişim jetonları, yukarıdaki örnekte gösterildiği gibi tüketici anahtarı/tüketici gizli anahtarı çiftleri olan istemci kimlik bilgileri karşılığında oluşturulur.

Edge'deki istemci kimlik bilgileri izin türü, API proxy'lerindeki politikalar kullanılarak uygulanır. Tipik bir OAuth akışı iki adımdan oluşur:

  • İstemci kimlik bilgilerinden OAuth erişim jetonu oluşturmak için Call API proxy 1'i seçin. Bu işlem, API proxy'sindeki OAuth v2.0 politikası tarafından yönetilir.
  • OAuth erişim jetonunu bir API çağrısında göndermek için Call API proxy 2'yi seçin. API proxy'si, OAuth v2.0 politikası kullanarak erişim jetonunu doğrular.

Gerekenler

  • Apigee Edge hesabı. Henüz hesabınız yoksa Apigee Edge hesabı oluşturma sayfasındaki talimatlarla kaydolabilirsiniz.
  • Komut satırından API çağrıları yapmak için makinenize cURL yüklenmiştir.

Jeton oluşturan API proxy'si indirin ve dağıtın

Bu adımda, API çağrısında gönderilen bir tüketici anahtarı ve tüketici sırrından OAuth erişim jetonu oluşturan API proxy'si oluşturacaksınız. Apigee, bunu yapan örnek bir API proxy'si sunar. Proxy'yi şimdi indirip dağıtacaksınız ve eğitimde daha sonra kullanacaksınız. (Bu API proxy'sini kendiniz kolayca oluşturabilirsiniz. Bu indirme ve dağıtma adımı kolaylık sağlamak ve önceden oluşturulmuş proxy'leri paylaşmanın ne kadar kolay olduğunu göstermek içindir.)

  1. "oauth" örnek API proxy'si ZIP dosyasını, dosya sisteminizdeki herhangi bir dizine indirin.
  2. https://apigee.com/edge adresine gidip oturum açın.
  3. Sol gezinme çubuğunda Geliştirme > API Proxy'leri öğesini seçin.
  4. + Proxy'yi tıklayın.
    Proxy oluştur düğmesi
  5. Proxy Oluşturma sihirbazında, Proxy paketi yükle'yi tıklayın.
  6. İndirdiğiniz oauth.zip dosyasını seçin ve İleri'yi tıklayın.
  7. Oluştur'u tıklayın.
  8. Derleme tamamlandıktan sonra API proxy düzenleyicisinde yeni proxy'yi görüntülemek için Proxy'yi düzenle'yi tıklayın.
  9. API Proxy düzenleyicisine Genel Bakış sayfasında Dağıtım açılır menüsünü tıklayın ve test seçeneğini belirleyin. Bu, kuruluşunuzdaki test ortamıdır.

    Onay isteminde Dağıt'ı tıklayın.
    Dağıtım açılır menüsünü tekrar tıkladığınızda yeşil bir simge, proxy'nin test ortamına dağıtıldığını gösterir.

Tebrikler! Erişim jetonu oluşturan bir API proxy'sini başarıyla indirip Edge kuruluşunuza dağıttınız.

OAuth akışını ve politikasını görüntüleme

API proxy'sinin içeriğini daha yakından inceleyelim.

  1. API proxy düzenleyicisinde Geliştir sekmesini tıklayın. Soldaki Gezgin bölmesinde iki politika görürsünüz. Ayrıca Proxy Endpoints bölümünde iki POST akışı görürsünüz.
  2. Proxy Endpoints altındaki AccessTokenClientCredential bağlantısını tıklayın.

    XML kodu görünümünde AccessTokenClientCredential adında bir Flow görürsünüz:

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>
    

    Akış, API proxy'sindeki bir işleme adımıdır. Bu durumda, belirli bir koşul karşılandığında akış tetiklenir (buna koşullu akış denir). <Condition> öğesinde tanımlanan koşul, API proxy çağrısı /accesstoken kaynağına yapılırsa ve istek fiili POST ise erişim jetonunu oluşturan GenerateAccessTokenClient politikasını yürütür.

  3. Şimdi koşullu akışın tetikleyeceği politikaya göz atalım. Akış şemasında GenerateAccessTokenClient politika simgesini tıklayın.

    Aşağıdaki XML yapılandırması kod görünümüne yüklenir:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, so expire in an hour -->
        <ExpiresIn>3600000</ExpiresIn>
        <SupportedGrantTypes>
            <!-- This part is very important: most real OAuth 2.0 apps will want to use other
             grant types. In this case it is important to NOT include the "client_credentials"
             type because it allows a client to get access to a token with no user authentication -->
            <GrantType>client_credentials</GrantType>
        </SupportedGrantTypes>
        <GrantType>request.queryparam.grant_type</GrantType>
        <GenerateResponse/>
    </OAuthV2>
    

    Yapılandırma şunları içerir:

    • Önceden tanımlanmış birkaç değerden biri olabilen <Operation>, politikanın ne yapacağını tanımlar. Bu örnekte, bir erişim jetonu oluşturur.
    • Jeton, oluşturulduktan 1 saat (360.000 milisaniye) sonra geçerliliğini yitirir.
    • <SupportedGrantTypes> bölgesinde kullanılması beklenen OAuth <GrantType>, client_credentials'dir (tüketici anahtarı ve sırrını OAuth jetonu için değiştirme).
    • İkinci <GrantType> öğesi, politikaya OAuth 2.0 spesifikasyonunun gerektirdiği şekilde izin türü parametresi için API çağrısında nereye bakılacağını bildirir. (Bunu daha sonra API çağrısında görürsünüz). İzin türü, HTTP üst bilgisi içinde (request.header.grant_type) veya form parametresi (request.formparam.grant_type) olarak da gönderilebilir.

Şu anda API proxy'si ile ilgili başka bir işlem yapmanıza gerek yoktur. Sonraki adımlarda, OAuth erişim jetonu oluşturmak için bu API proxy'sini kullanacaksınız. Ancak öncelikle birkaç şey daha yapmanız gerekiyor:

  • OAuth ile güvenliğini sağlamak istediğiniz API proxy'sini oluşturun.
  • Tüketici anahtarı ve tüketici sırrının erişim jetonuyla değiştirilmesine neden olacak birkaç yapı daha oluşturun.

OAuth korumalı API proxy'si oluşturma

"Sahte hedef" hakkında

mocktarget hizmeti, Apigee'de barındırılır ve basit veriler döndürür. Hatta bu kayıtlara bir web tarayıcısından erişebilirsiniz. Aşağıdakileri tıklayarak deneyin:

http://mocktarget.apigee.net/ip

Hedef, en sonunda bu API proxy'sini çağırdığınızda görmeniz gereken sonucu döndürür.

Ayrıca örnek hedefteki diğer API kaynaklarını görmek için http://mocktarget.apigee.net/help adresine gidebilirsiniz.

Şimdi, korumak istediğiniz API proxy'sini oluşturacaksınız. Bu, istediğiniz bir şeyi döndüren API çağrısıdır. Bu durumda API proxy'si, IP adresinizi döndürmek için Apigee'nin sahte hedef hizmetini çağırır. ANCAK bunu yalnızca API çağrınızla geçerli bir OAuth erişim jetonu iletirseniz görürsünüz.

Burada oluşturduğunuz API proxy'si, istekte OAuth jetonu olup olmadığını kontrol eden bir politika içerir.

  1. Sol gezinme çubuğunda Geliştirme > API Proxy'leri öğesini seçin.
  2. + Proxy'yi tıklayın.
    Proxy oluştur düğmesi
  3. Proxy oluşturun sihirbazında, Ters proxy (en yaygın) seçeneğini belirleyin ve İleri'yi tıklayın.
  4. Proxy'yi şu şekilde yapılandırın:
    Bu alanda bunu yap
    Proxy Adı Şunu girin: helloworld_oauth2
    Proje Temel Yolu

    Şununla değiştir: /hellooauth2

    Proje Temel Yolu, API proxy'sine istek göndermek için kullanılan URL'nin bir parçasıdır.

    Mevcut API

    Şunu girin: https://mocktarget.apigee.net/ip

    Bu parametre, Apigee Edge'in API proxy'sine yapılan bir istekte çağırdığı hedef URL'yi tanımlar.

    Açıklama Şunu girin: hello world protected by OAuth
  5. İleri'yi tıklayın.
  6. Genel politikalar sayfasında:
    Bu alanda bunu yap
    Güvenlik: Yetkilendirme Seçin: OAuth 2.0
  7. İleri'yi tıklayın.
  8. Virtual Hosts (Sanal Barındırıcılar) sayfasında Next (İleri) seçeneğini tıklayın.
  9. Derleme sayfasında test ortamının seçili olduğundan emin olun ve Oluştur ve Dağıt'ı tıklayın.
  10. Özet sayfasında, yeni API proxy'nizin başarıyla oluşturulduğuna ve API proxy'sinin test ortamınıza dağıtıldığına dair bir onay görürsünüz.
  11. API proxy'sine ilişkin Genel Bakış sayfasını görüntülemek için Proxy'yi düzenle'yi tıklayın.
    Bu kez API proxy'sinin otomatik olarak dağıtıldığına dikkat edin. "Test" ortamının yanında yeşil bir dağıtım noktası olduğundan emin olmak için Dağıtım açılır menüsünü tıklayın.

Politikaları görüntüle

Oluşturduklarınıza daha yakından bakalım.

  1. API proxy düzenleyicisinde Geliştir sekmesini tıklayın. API proxy'sinin istek akışına iki politikanın eklendiğini göreceksiniz:
    • OAuth v2.0 Erişim Jetonunu Doğrulama: Geçerli bir OAuth jetonunun mevcut olduğundan emin olmak için API çağrısını kontrol eder.
    • Remove Header Authorization (Başlık Yetkilendirmesini Kaldır) – Erişim jetonunu kontrol edildikten sonra, hedef hizmete iletilmemesi için kaldıran bir AttributionMessage politikasıdır. (Hedef hizmette OAuth erişim jetonu gerekiyorsa bu politikayı kullanamazsınız).
  2. Akış görünümünde OAuth v2.0 Erişim Jetonunu Doğrula simgesini tıklayın ve kod bölmesinde altındaki XML'e bakın.

    <OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
        <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
        <Operation>VerifyAccessToken</Operation>
    </OAuthV2>
    

    <Operation> öğesinin VerifyAccessToken olduğuna dikkat edin. İşlem, politikanın ne yapması gerektiğini tanımlar. Bu durumda, istekte geçerli bir OAuth jetonu olup olmadığını kontrol eder.

API ürünü ekleyin

Apigee kullanıcı arayüzünü kullanarak API ürünü eklemek için:

  1. Yayınla > API Ürünleri'ni seçin.
  2. +API ürünü'nü tıklayın.
  3. API ürününüzün ürün ayrıntılarını girin.
    Alan Açıklama
    Ad API ürününün dahili adı. Adda özel karakter belirtmeyin.
    Not: API ürünü oluşturulduktan sonra adı düzenleyemezsiniz. Örneğin, helloworld_oauth2-Product
    Görünen ad API ürününün görünen adı. Görünen ad, kullanıcı arayüzünde kullanılır ve istediğiniz zaman bu adı düzenleyebilirsiniz. Belirtilmezse Name (Ad) değeri kullanılır. Bu alan, Ad değeri kullanılarak otomatik olarak doldurulur. Bu alanın içeriğini düzenleyebilir veya silebilirsiniz. Görünen ad özel karakterler içerebilir. Örneğin, helloworld_oauth2-Product.
    Açıklama API ürününün açıklaması.
    Ortam API ürününün erişime izin vereceği ortamlar. API proxy'sini dağıttığınız ortamı seçin. Örneğin, test.
    Erişim Herkese açık'ı seçin.
    Erişim isteklerini otomatik olarak onayla Herhangi bir uygulamadan bu API ürünü için anahtar isteklerinin otomatik olarak onaylanmasını etkinleştirin.
    Kota Bu eğitim için yoksayın.
    İzin Verilen OAuth Kapsamları Bu eğitim için yoksayın.
  4. API proxy'leri alanında, az önce oluşturduğunuz API proxy'sini seçin.
  5. Yol alanına "/" yazın. Diğer alanları dikkate almayın.
  6. Kaydet'i tıklayın.

Kuruluşunuza geliştirici ve uygulama ekleyin

Ardından, API'lerinizi kullanmak üzere kaydolan bir geliştiricinin iş akışını simüle edeceksiniz. İdeal olarak, geliştiricilerin kendilerini ve uygulamalarını geliştirici portalınız üzerinden kaydettirmeleri önerilir. Ancak bu adımda, bir geliştirici ve bir uygulamayı yönetici olarak ekleyeceksiniz.

Bir geliştiricinin, API'lerinizi çağıran bir veya daha fazla uygulaması olacaktır ve her uygulama benzersiz bir tüketici anahtarı ve tüketici sırrı alır. Edge hangi geliştiricinin ve uygulamanın hangi OAuth jetonuna ait olduğunu bileceği için bu anahtar/uygulama başına gizli anahtar, API sağlayıcısı olarak da size API'lerinize erişim konusunda daha ayrıntılı kontrol ve API trafiği hakkında daha ayrıntılı analiz raporları sunar.

Geliştirici oluşturma

Nigel Tufnel adında bir geliştirici oluşturalım.

  1. Menüde Yayınla > Geliştiriciler'i seçin.
  2. + Geliştirici'yi tıklayın.
  3. Yeni Geliştirici penceresine aşağıdakileri girin:
    Bu alanda Enter
    Ad Nigel
    Soyadı Tufnel
    Kullanıcı Adı nigel
    E-posta nigel@example.com
  4. Oluştur'u tıklayın.

Uygulama kaydetme

Nigel için bir uygulama oluşturalım.

  1. Yayınla > Uygulamalar'ı seçin.
  2. + Uygulama'yı tıklayın.
  3. New App (Yeni Uygulama) penceresine aşağıdakileri girin:
    Bu alanda bunu yap
    Ad ve Görünen Ad Şunu girin: nigel_app
    Developer Geliştirici'yi tıklayıp seçin: Nigel Tufnel (nigel@example.com)
    Geri çağırma URL'si ve Notlar Boş bırak
  4. Ürünler altında, Ürün Ekle'yi tıklayın.
  5. helloworld_oauth2-Product öğesini seçin.
  6. Oluştur'u tıklayın.

Tüketici anahtarını ve tüketici sırrını alma

Artık OAuth erişim jetonuyla değiştirilecek tüketici anahtarını ve tüketici sırrını alacaksınız.

  1. nigel_app sayfasının gösterildiğinden emin olun. Görmüyorsanız Uygulamalar sayfasında (Yayınla > Uygulamalar) nigel_app'i tıklayın.
  2. nigel_app sayfasındaki Anahtar ve Gizli sütunlarında Göster'i tıklayın. Anahtar/sırrın, önceden otomatik olarak oluşturulan "helloworld_oauth2-Product" ile ilişkilendirildiğine dikkat edin.

  3. Anahtar ve Sırrı seçip kopyalayın. Bunları bir geçici metin dosyasına yapıştırın. Bunları daha sonraki bir adımda kullanacaksınız. Bu adımda, bu kimlik bilgilerini OAuth erişim jetonuyla değiştirecek API proxy'sini çağıracaksınız.

IP adresinizi almak için API'yi çağırmayı deneyin (başarısız).

Sadece başlatmak için IP adresinizi döndürmesi gereken korumalı API proxy'sini çağırmayı deneyin. Aşağıdaki cURL komutunu, bir terminal penceresinde Edge kuruluşunuzun adıyla değiştirerek yürütün. URL'deki test kelimesi kuruluşunuzun test ortamıdır ve proxy'lerinizi dağıttığınız ortamdır. Proxy temel yolu, proxy'yi oluştururken belirttiğiniz temel yol olan /hellooauth2'dir. Çağrıda OAuth erişim jetonu iletmediğinize dikkat edin.

curl https://ORG_NAME-test.apigee.net/hellooauth2

API proxy'sinde, OAuth v2.0 Erişim Jetonunu Doğrulama politikası, istekte geçerli bir OAuth jetonu olup olmadığını kontrol ettiği için çağrı, aşağıdaki mesajla başarısız olur.

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

Bu durumda başarısızlık iyidir. API proxy'nizin çok daha güvenli olduğu anlamına gelir. Yalnızca geçerli OAuth erişim jetonu olan güvenilir uygulamalar bu API'yi başarıyla çağırabilir.

OAuth erişim jetonu alma

Şimdi en büyük faydayı sağlamaya geçebiliriz. Kopyalayıp bir metin dosyasına yapıştırdığınız anahtarı ve gizli anahtarı kullanmak ve bunları bir OAuth erişim jetonuyla değiştirmek üzeresiniz. Şimdi, içe aktardığınız API örnek proxy'sine (oauth) bir API çağrısı yapacaksınız. Bu işlem bir API erişim jetonu oluşturur.

Bu anahtarı ve gizli anahtarı kullanarak aşağıdaki cURL çağrısını yapın (protokolün https olduğunu unutmayın). Burada belirtilen yerlerde Edge kuruluş adınızı, anahtarınızı ve gizli kodunuzu değiştirin:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

Arama yapmak için Postman gibi bir istemci kullanıyorsanız client_id ve client_secret öğelerinin, isteğin Gövde bölümünde yer alacağını ve x-www-form-urlencoded olması gerektiğini unutmayın.

Şuna benzer bir yanıt alırsınız:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

OAuth erişim jetonunuzu aldınız. access_token değerini (tırnak işaretleri olmadan) kopyalayıp metin dosyanıza yapıştırın. Birazdan bunu kullanacaksınız.

Ne oldu?

Erişim jetonu oluşturan GenerateAccessTokenClient OAuth politikasını yürütmek için daha önce, oauth proxy'sinde söz konusu koşullu akışa baktığınızda, kaynak URI'sının /accesstoken ve istek fiilinin POST olduğunu belirttiğinizde hatırlıyor musunuz? cURL komutunuz bu koşulları karşıladığı için OAuth politikası yürütüldü. Ekip, tüketici anahtarınız ile tüketici gizli anahtarınızı doğrulayarak bunların yerine 1 saat içinde süresi dolacak bir OAuth jetonu aldı.

API'yi erişim jetonuyla çağırma (başarılı!)

Artık bir erişim jetonunuz olduğuna göre API proxy'sini çağırmak için bu jetonu kullanabilirsiniz. Aşağıdaki cURL çağrısını yapın. Bunun yerine Edge kuruluş adınızı ve erişim jetonunu kullanın.

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

Artık IP adresinizi döndüren API proxy'sine başarılı bir çağrı almanız gerekir. Örneğin:

{"ip":"::ffff:192.168.14.136"}

Bu API çağrısını yaklaşık bir saat boyunca tekrarlayabilirsiniz. Bu sürenin sonunda erişim jetonunun süresi dolar. Bir saat sonra çağrı yapmak için önceki adımları kullanarak yeni bir erişim jetonu oluşturmanız gerekir.

Tebrikler! API proxy'si oluşturdunuz ve çağrıya geçerli bir OAuth erişim jetonunun dahil edilmesini zorunlu kılarak API proxy'sini korudunuz.

İlgili konular