> ## 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 Database Provider Aracılığıyla Plain-Text Authentication Politikasının Uygulanması

> Swagger Petstore REST API'sine veritabanı provider aracılığıyla Plain-Text Authentication politikasının nasıl uygulanacağını açıklar. Veritabanı bağlantısının kurulmasından kimlik doğrulama ayarlarının yapılmasına, politikasının eklenmesinden 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 Plain-Text türünde** güvenlik bilgisinin gelmesini bekler.
* **Authentication** bilgileri kontrol edilmek üzere veritabanına gönderilir.
* **Veritabanından** Apinizer'a authentication bilgileriyle ilgili cevap döner. Bu authentication doğrulaması yapılamazsa Apinizer isteği keser ve hata mesajı döner. Doğrulama yapılabilirse akış devam eder.
* **Apinizer, Backend API'ye istekte** bulunur.
* **Backend API, Apinizer'a** yanıt verir.
* **Apinizer, API Client'a** yanıtı iletir.

<img src="https://mintcdn.com/apinizer/fVODWwZ3NOBhJZqU/images/tutorials/database1.png?fit=max&auto=format&n=fVODWwZ3NOBhJZqU&q=85&s=fe04357f84bca29518b2753bf965aa2d" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/database1.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.

**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 alabilir.
</Info>

Sağ üst köşede yer almakta olan **Create** butonuna tıklanır ve yeni bir **proxy** oluşturmaya 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 dokümantasyon adresi** 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 almakta olan **All** ifadesiyle eklenecek politikalar **tüm metotlara** 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" />

## Veritabanı Bağlantısının Gerçekleştirilmesi

**Connection Management** menüsü altında yer alan **Veritabanı** menüsüne tıklanır.

<Info>
  Daha önceden herhangi bir veritabanı tanımı gerçekleştirilmemiş ise bu sayfada **No records found!** yazısı görülebilir.
</Info>

Veritabanı bağlantısını oluşturmak için sağ üst köşede yer alan **Create** butonuna tıklanır.

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

Bu ekran üzerinde yer alan alanlar:

* **Name** alanı ile oluşturulan bağlantının ismi ifade edilir.
* **Description** ifadesi ile oluşturulan bağlantıya açıklama eklenebilir.
* **JDBC URL** alanı ile bağlanılacak olan veritabanına bağlanmak için gerekli olan JDBC adresi yazılır. Bu bilgi veritabanı ekibinden edinilebilir.
* **Username** alanı ile bağlantı esnasında kullanılacak olan kullanıcı adı bilgisi, **Password** alanı ile de bağlantı esnasında kullanılacak olan parola girilir.

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

<Tip>
  Veritabanı yöneticisi veya ekibinden sağ taraftaki bağlantı bilgileri ile ilgili en uygun değerler ne olacak bilgisi alınarak bu kısım düzenlenir.
</Tip>

**Test Connection** butonuna tıklanarak test işlemi gerçekleştirilir, **Save and Deploy** butonuna tıklanarak da işlemler kaydedilir.

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

Kayıt işlemi gerçekleştikten sonra ise aşağıdaki görselde yer aldığı gibi oluşturulan bağlantı görüntülenir.

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

## Veritabanı ile Kimlik Doğrulama Bağlantılarının Eklenmesi

**Identity Management > Identity Providers > Database** bölümünden daha önce oluşturulmuş veritabanı ile kimlik doğrulama tanımını eklemek üzere giriş yapılır.

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

### Veritabanı ile Kimlik Doğrulama (Authentication) Bağlantısı

**Create** tuşuna basılır ve bağlantı ayarları girilir:

* Bağlantıya isim ve açıklama girilir.
* **Encryption Type** ile veritabanı bağlantısında kullanılacak tabloda **parola** bilgisi şifreli tutuluyor ise tabloda tutulan şifreye ait şifreleme türü seçilmelidir.
* **Database Connection Pool Definition** alanı ile önceki adımlarda hazırlanan veritabanı seçilir.
* Bir sorgu veritabanından Kullanıcı adı/parola çiftlerini ya da rol listesini almak için kullanılır. Sorguda kullanıcı adı parametresi `:username` şeklinde ve parola parametresi `:password` şeklinde tanımlanmalıdır. Apinizer iki nokta üsüste karakterini algılar ve ilgili parametrenin dışarıdan gönderileceğini bilerek buna göre işlem yapar.

<img src="https://mintcdn.com/apinizer/09PxOro0-7rcnyUk/images/tutorials/database6.png?fit=max&auto=format&n=09PxOro0-7rcnyUk&q=85&s=3e2b28adcf848ad113e4159835e5fb6a" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/database6.png" />

<Warning>
  **Test Username** ve **Test Password** alanları **veritabanında** olan bir bilgi doldurularak sorgunun çalışıp çalışmadığı test edilebilir. **Yapılan tanımı kaydetmeden önce bu alanların temizlenmesi tavsiye edilmektedir.**
</Warning>

### Veritabanı ile Kimlik Yetkilendirmesi (Authorization) Bağlantısı

Kimlik doğrulama bağlantısından tek farkı girilen query'dir. Bu alanda kimlik yetkilendirme işlemi yapılacağı için query kısmında sadece ilgili rolün adı alınır.

<img src="https://mintcdn.com/apinizer/09PxOro0-7rcnyUk/images/tutorials/database7.png?fit=max&auto=format&n=09PxOro0-7rcnyUk&q=85&s=9be471d63e141307f7a5f7f511ba34ef" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/database7.png" />

## Authentication Politikasının Oluşturulması

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

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

Açılan sayfada **Plain-Text Authentication** politikası seçilir.

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

Bu ekran üzerinde yer alan alanlar:

* **Identity/Role/Group Service** alanında **veritabanı** bölümünden kontrolü sağlayacak veritabanı seçilir.
* **Variable for username** ve **variable for password** ifadeleri ile de kullanıcı adı ve parola bilgisinin hangi değişken ile alınacağı seçilir. Bu senaryoda bu değerler **header** içerisinden username ve password değerlerinde beklenecek ve alınacaktır.

<Warning>
  **Clear Authentication Information** seçeneği seçilirse gelen mesaj içerisinde authentication bilgisi, backend api'ye giderken temizlenir. **Bu ayarın aktifleştirilmesi özel bir durum olmadığı sürece her zaman tavsiye edilmektedir.**
</Warning>

* **Add Client Info To Header** seçeneği backend API'ye gidecek Header içerisinde ayrı bir header değeri ile kullanıcı adının iletilmesini sağlar.
* **Authorization Configuration** alanında kullanıcı kimlik doğrulaması gerçekleştirilmiş kişilerin rolleriyle ilgili kurallar girilebilecek alandır.
* **Add Roles To Header** seçeneği seçilirse yetkilendirme başarılı olduğu takdirde istemcinin rollerini "X-Authenticated-UserRoles" başlığına ekler.
* **Identity/Role/Group Service** alanında seçilecek **veritabanı** bölümünden rol bilgilerinin bulunduğu veritabanı seçilir. Bu genelde kimlik kontrolünü sağlayan veritabanı ile aynı tanımla yapılmaktadır.
* **Roles/Group** alanında kimlik yetkilendirilmesi yapılacak roller girilir.
* İstemcinin, API'ye erişmek için burada tanımlanan rollerin/grupların **tümüne** mi **herhangi birine** mi sahip olması yeterli olacaktır ayarı yapılır.
* **Enable Role/Group Based Method Access** seçeneği seçildiği zaman önce API'ye erişim izni verilen roller kontrol edilir. Ardından, metodlara erişimi kontrol etmek için diğer rollere bakılır.

<img src="https://mintcdn.com/apinizer/09PxOro0-7rcnyUk/images/tutorials/database8.png?fit=max&auto=format&n=09PxOro0-7rcnyUk&q=85&s=2f0d5762303905c6018c746502ff8baa" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/database8.png" />

<Info>
  Politika kaydolduğu zaman ilgili ikon görülmektedir.
</Info>

Yapılan işlemin geçerli olması için proxy'nin **Redeploy** edilmesi gerekmektedir. Redeploy işlemi sonrası API proxy test edilebilir.

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

## API Proxy'nin Test Edilmesi

**"/pet/{petId}"** gibi bir endpoint seçildikten sonra, **Test Endpoint** butonuna tıklanır.

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

URL'de ya da parametre sekmesinde istenilen pet id değeri girilir, **Send** butonuna basıldığında dönen yanıt bir hata mesajı olacaktır.

<img src="https://mintcdn.com/apinizer/09PxOro0-7rcnyUk/images/tutorials/database9.png?fit=max&auto=format&n=09PxOro0-7rcnyUk&q=85&s=edf6477e04dde5486d12782794a892d7" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/database9.png" />

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

**Backend API'ye** gönderilecek olan header'lar içerisinde username ve password header'larında veritabanında olan bir kullanıcının bilgileri girilerek test tekrarlanır ve başarılı cevap alınması beklenir.

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