> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# REST API'ye Security Manager Provider Aracılığıyla OAuth2 Authentication Poliçesinin Uygulanması

> Swagger Petstore REST API'sine Security Manager provider aracılığıyla OAuth2 Authentication poliçesinin nasıl uygulanacağını açıklar. Credential oluşturulmasından politikasının eklenmesine, token oluşturulmasından test edilmesine kadar tüm adımları içerir.

Aşağıdaki grafikte yer alan numaralandırmalar işlemlerin **yapılış sırasına aittir.**

* **Apinizer** içerisinde yer alan **Security Manager, API Client'tan OAuth2 türünde authentication** bilgisini ister. Bu authentication doğru ise akış devam eder.
* **Apinizer, Backend API'ye istekte** bulunur.
* **Backend API, Apinizer'a** yanıt verir.
* **Apinizer, API Client'a** yanıt verir.

<img src="https://mintcdn.com/apinizer/bxDpmriTStVknLzL/images/tutorials/oauth1.png?fit=max&auto=format&n=bxDpmriTStVknLzL&q=85&s=a67c09fb07dc8db9833c31dad9639fb0" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth1.png" />

## API Proxy'nin Oluşturulması

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo2.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=052195ac9313eff2da0121245624677f" alt="Senaryo Diyagramı" width="200" data-path="images/tutorials/senaryo2.png" />

Swagger Petstore isimli REST API'ye [https://petstore.swagger.io/](https://petstore.swagger.io/) adresinden erişim sağlanabilmektedir.

İlk olarak bu adresin **API Proxy** olarak tanımlanması gereklidir.

Bunun için **Development** menüsü altında yer alan **API Proxies** seçeneğine tıklanır.

<Info>
  Açılan sayfada daha önceden herhangi bir **proxy** tanımı yapılmadığı için **No records found!** yazısı yer alır.
</Info>

Sağ üst köşede yer almakta olan **Create** butonuna tıklanır ve yeni bir **proxy** oluşturulmaya başlanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo3.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=938b0de54e7641fce65b865f3f5182b0" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo3.png" />

Bu kısımda oluşturulacak olan **API Proxy'nin** hangi tipte olduğunun seçilmesi gerekmektedir.

Bu senaryoda kullanılacak olan API'nin türü **Swagger 2.X** olacağı için bu tür seçilir.

**Enter URL** ifadesine tıklanarak kullanılacak olan API'nin adresinin girileceği ekrana geçiş yapılır.

<img src="https://mintcdn.com/apinizer/ocsi_kVjLluGlu4Z/images/tutorials/swagger.png?fit=max&auto=format&n=ocsi_kVjLluGlu4Z&q=85&s=13223791b611fc908487605c87b11809" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/swagger.png" />

URL kısmına **erişim sağlanacak adres girilerek Parse** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/yvmWFcjBSxooF86u/images/tutorials/senaryo5.png?fit=max&auto=format&n=yvmWFcjBSxooF86u&q=85&s=ab4f310e6a80807e54f36f0c72c39e4e" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo5.png" />

Parse işlemi yapıldıktan sonra API Proxy'ye ait ayarlar yapılabilmektedir:

* **Usage** alanı ile oluşturulan API Proxy'nin kim tarafından kullanılacağı belirtilir. Burada **publisher, consumer, publisher and consumer** gibi seçenekler yer almaktadır.
* **Sharing Type** alanı ile oluşturulan API Proxy'nin paylaşım tipi belirtilir. Burada **external, internal, external and internal** gibi seçenekler yer almaktadır.
* **Addresses** sekmesi altında yer alan iki API adresinden biri veya her ikisi de seçilebilir eğer iki adres de seçilecek olursa Apinizer **Load Balance** işlemini kendisi gerçekleştirecektir.
* **Relative Path** ise oluşturulan API Proxy'nin erişime açılacak adresidir.
* **Category List** alanı da oluşturulan API Proxy'nin kategorilendirilmesine olanak sağlar.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo6.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=511fa694bec2af3fdd31ccc6bb17115f" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo6.png" />

Bu ayarlamalar yapıldıktan sonra API Proxy kaydedilir.

Kaydetme işleminden sonra açılan sayfada **Develop** sekmesine tıklanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo7.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=423589a8890368635457719c9d59acec" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo7.png" />

<Info>
  Bu endpointlerin üstünde yer alan **All** ifadesiyle eklenecek olan poliçeler **tüm endpointlere** uygulanabilmektedir.
</Info>

Oluşturulan API Proxy deploy edilir. Bunun için yukarıda orta kısımda yer alan **Deploy** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo8.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=3338ba7df1da3c1536385471851b0fff" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo8.png" />

## Credentials Oluşturulması

Eklenecek **Credentials'a** ait bilgiler **username = apinizer**, **password = 123123aA** olacak şekildedir.

Bunun için **Identity Management** menüsüne gelinir.

Burada ise **Credential Management** menüsü altında yer alan **Credentials** menüsüne tıklanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo9.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=b6251e96ba25024507bf54bb9c42088e" alt="Senaryo Diyagramı" width="200" data-path="images/tutorials/senaryo9.png" />

Açılan ekranda sağ üst köşede yer alan **Create** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo10.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=7f11ddaa0164cd3fe50bb9632b47235a" alt="Senaryo Diyagramı" width="600" data-path="images/tutorials/senaryo10.png" />

Burada gerekli olan alanlar daha önceden belirtilen şekilde doldurulur ve **Save and Deploy** butonuna tıklayarak oluşturulan **credential** kaydedilir.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo11.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=69a55f3f592c442fb8b0606c6e226b08" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo11.png" />

Bu **credential öğesinin** erişim sağlayacağı proxy'nin seçilmesi gerekmektedir. Oluşturulan **credential'ın** üzerine gelip yanda yer alan menüden **Edit** seçeneğine tıklanır.

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo12.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=bef3068f5bab8cd8bdb0db0989543527" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo12.png" />

Açılan ekran üzerinden **API Proxy ACL** sekmesine tıklanır, bu sekme içerisinde yer alan butona tıklanır.

<img src="https://mintcdn.com/apinizer/bxDpmriTStVknLzL/images/tutorials/api-proxy-acl.png?fit=max&auto=format&n=bxDpmriTStVknLzL&q=85&s=4382f031671c9a1db129f0cbec08544f" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/api-proxy-acl.png" />

Açılan sayfada şu an üzerinde çalışılan projede bulunan **API Proxy'ler** listelenmektedir. **Swagger Petstore** isimli **proxy** seçilir.

**Add** butonuna tıklayarak oluşturulan **Credential** öğesinin bu **proxy'ye erişimi olacağı belirtilir.**

<img src="https://mintcdn.com/apinizer/VUbwu9iu7Snx108F/images/tutorials/senaryo14.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=86bfab93f7d0e4dfe924a20118d31bce" alt="Senaryo Diyagramı" width="600" data-path="images/tutorials/senaryo14.png" />

Sağ üst köşede yer alan **Save and Deploy** butonuna tıklanır ve yapılan işlem kaydedilir.

<img src="https://mintcdn.com/apinizer/DnFDBUWIRDlha2Jf/images/tutorials/save.png?fit=max&auto=format&n=DnFDBUWIRDlha2Jf&q=85&s=8ba1e2ddbbe1b48baf9a833b3337b967" alt="Senaryo Diyagramı" width="600" data-path="images/tutorials/save.png" />

## Authentication Poliçesinin Eklenmesi

Artık **OAuth2 Authentication** poliçesi eklenebilir duruma gelmiştir.

API proxy'lerin listelendiği sayfaya gidilir ve buradan **Swagger Petstore** isimli proxy seçilir.

Daha sonra ise **Develop** sekmesine gelinir, **Add Policy** butonuna tıklanır.

Açılan sayfada **OAuth2 Authentication** poliçesi seçilir.

<img src="https://mintcdn.com/apinizer/bxDpmriTStVknLzL/images/tutorials/oauth2.png?fit=max&auto=format&n=bxDpmriTStVknLzL&q=85&s=e562c5dc4a22908715fcc62786f60336" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth2.png" />

Bu ekran üzerinde yer alan alanlar:

* **Grant Type** alanı ile kullanılacak **token servisinin** kullanıcı bilgilerinin nasıl doğrulanacağı belirtilir eğer **Client Credentials** ifadesi seçilirse **(Identity/Role/Group) Service** kullanılamaz.
* **Show API Key** alanı ile oluşturulan proxy'ye ait **API proxy key** değerleri gözükmektedir.
* **Delete Previous Token** alanı ile daha önceden bulunan token geçersiz hale getirir.
* **Token Never Expires** alanı ile oluşturulan token'a bir zaman değeri atanmaz ve istenildiği kadar kullanılabilir bu seçenek seçilmez ise hemen altında aşağıdaki görselde yer alan bir menü oluşur.
* **Token Expires In** alanı ile token'ın ne kadar bir süre geçerli olacağı belirtilir, bu belirtme işlemi açılır menü içerisinde yer alan zaman ifadeleri ile ayarlanabilir.
* **Refresh Token Allowed** alanı ile oluşturulan token'ın yenilenme özelliği aktifleştirilir. Bu seçenek seçildiği takdirde de kaç kez yenilenebileceğine dair ayarlamanın yapılacağı alan gelmektedir ve bu alana ait görsel aşağıda yer almaktadır.
* **Refresh Token Count** token'ın kaç kez yenilenebilir olacağını belirtir.
* **Refresh Token Expires In** alanı ise yenilenen token'ın ne kadarlık bir yaşam süresine sahip olacağını belirtir.
* **Allow URL Parameters** alanı ile token üretimi için istek gönderildiğinde gidecek olan bilgilerin sadece mesaj gövdesinde gönderilmesine izin verilir. Eğer bu bilgilerin "URL Parametresi" olarak gönderilmesi istenirse bu seçenek seçilmelidir ancak bu durum bir güvenlik riski oluşturacağı için önerilmez.

<Warning>
  **Clear Authentication Information** alanı ile backend API'ye gidecek mesaj içerisinde herhangi bir kimlik doğrulama bilgisi varsa bu bilgiler silinir ve **backend API'ye** gönderilmez. Bu ayarın aktifleştirilmesi özel bir durum olmadığı sürece her zaman tavsiye edilmektedir.
</Warning>

* **Add Client Info to Header** alanı ile kimlik doğrulama başarılı bir şekilde gerçekleştiğinde, yetkilendirilmiş olan kullanıcı adını header'ın içine koyarak backend API'ye gönderir. Bu seçenek işaretlendiğinde ise hemen altında içerisinde **X-Authenticated-UserId** yazan bir input alanı oluşacaktır. Bu alan header bilgisinin varsayılan adıdır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth3.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=d7712557d6e0522ccedf961d802c504a" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth3.png" />

Bu senaryo içerisinde kullanılacak olan ayarlamalar yapıldıktan sonra sağ üst köşede yer alan **Save** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth4.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=d95d2237fbebb891630bdce1770f65f1" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth4.png" />

Yapılan işlemin geçerli olması için proxy'nin **Deploy** olması gerekmektedir.

## Authentication İçin Token Oluşturulması

OAuth2 Authentication poliçesi içerisinde yer alan **Show API Key** seçeneğinden ilgili proxy'ye ait Public Key bilgisi alınır.

<img src="https://mintcdn.com/apinizer/hgrNPZYFT2UBF_R9/images/tutorials/token1.png?fit=max&auto=format&n=hgrNPZYFT2UBF_R9&q=85&s=00f4c6fb6f7d9b56f148fb27f84e736f" alt="Senaryo Diyagramı" width="400" data-path="images/tutorials/token1.png" />

Daha sonra ise **Test** menüsü altında yer alan **Test Console** menüsüne gelinir.

<img src="https://mintcdn.com/apinizer/hgrNPZYFT2UBF_R9/images/tutorials/token2.png?fit=max&auto=format&n=hgrNPZYFT2UBF_R9&q=85&s=eff44109815ffdf27ed437245454aa5e" alt="Senaryo Diyagramı" width="200" data-path="images/tutorials/token2.png" />

Bu ekrana geldikten sonra ise **Collection** sekmesi altında yer alan **New** butonuna tıklanır ve yeni bir **Collection** oluşturulur.

**Name** alanına **OAuth2** yazılır ve **Save** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth5.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=8c3c960ded7e081dff489cec1c2685a3" alt="Senaryo Diyagramı" width="400" data-path="images/tutorials/oauth5.png" />

Bu ekran üzerinde yer alan ifadeler tek tek incelenecek olursa,

* **Method** alanından method tipi seçilir.
* URL alanına token'ın alınacağı adres yazılır.
* Mesajın içeriği **body** kısmında yer alacağı için aşağıda yer alan sekmeden **body** ifadesi seçilir.
* Buraya token elde edebilmek için gerekli olan değerler yazılır ve **Send** butonuna tıklanır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth6.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=1f9b98f6ba9f0b41b64c09e28c1e0de2" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth6.png" />

Yanıt içerisinde yer alan **access\_token** bilgisi **OAuth2 Authentication** poliçesi oluşturulan proxy'de kullanmak için oluşturulmuştur.

Bu token kopyalanır.

Tekrardan API proxy'nin olduğu sayfaya geçiş yapılır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth7.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=c5480031462b23782a466d4f41233e63" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth7.png" />

## API Proxy'nin Test Edilmesi

**Swagger Petstore** isimli proxy seçilir.

**Develop** sekmesi altında yer alan **"/pet/{petId}"** isimli endpoint seçilir.

**Test Endpoint** ifadesine tıklanarak bu endpoint test edilir.

URL'de istenilen **petId** değeri **"1"** olarak girilir, **Send** butonuna basıldığında dönen yanıtın bir hata mesajı olduğu görülür.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth8.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=d6dac3b1a045c005d0af955c56c58b0a" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth8.png" />

<Warning>
  Bu hatanın uygulanmış olan **OAuth2 Authentication** ile alakalı olduğu görülmektedir. Çünkü **header'ın** içerisine hiçbir şekilde bir **authentication** bilgisi yerleştirilmemiştir.
</Warning>

Bu sefer **header** içerisine **Authorization header** yerleştirilir ve elde edilen **token bilgisi** burada kullanılır.

**Send** butonuna tıkladığında başarılı cevap alınır.

<img src="https://mintcdn.com/apinizer/P7f4dmgx7HxuJgfb/images/tutorials/oauth9.png?fit=max&auto=format&n=P7f4dmgx7HxuJgfb&q=85&s=988ebb6398670f0f027d63adb51b6de1" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/oauth9.png" />
