> ## 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 Basic (Base64) Authentication Poliçesinin Uygulanması

> Swagger Petstore REST API'sine Security Manager provider aracılığıyla Basic (Base64) Authentication poliçesinin nasıl uygulanacağını açıklar. Credential oluşturulmasından değişken tanımlamasına, politikasının eklenmesinden Base64 şifreleme ve 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 Basic (Base64) 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/VUbwu9iu7Snx108F/images/tutorials/senaryo1.png?fit=max&auto=format&n=VUbwu9iu7Snx108F&q=85&s=aa3e5c64acf513f6af7595e8ce9c448c" alt="Senaryo Diyagramı" width="800" data-path="images/tutorials/senaryo1.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 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 **Credential'a** ait bilgiler **username = apinizer**, **password = 123123aA** olacak şekildedir.

**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 bilgilerle 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" />

## Değişken Tanımlaması

Poliçede kullanılacak olan değişkenin tanımının yapılması gerekmektedir.

**Add** butonuna tıklanır.

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

* **Name** input alanına oluşturulmak istenilen değişkenin adı yazılır.
* **Type** alanında ise kullanılacak değişkenin tipi belirtilir.
* **Header Name** alanında ise kullanılacak değişkenin **Header** içerisinde hangi adla isimlendirileceği ifade edilir.

Yapılan değişiklikler **Save** butonuna tıklanarak kaydedilir.

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

## Authentication Poliçesinin Eklenmesi

Artık **Basic (Base64) 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 **Basic Authentication** poliçesi seçilir.

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

Bu ekran üzerinde yer alan alanlar:

* **Identity/Role/Group Service** alanında seçilecek olan değer **Security Manager** değeridir. Çünkü credentials kontrolü **Security Manager** tarafından gerçekleştirilecektir.
* **Variable for authorization** alanında ise kullanılan **authentication** türü **Basic** (**Base64**) olduğu için ve bu **authentication** türünde de kullanılan **username**-**password** bilgileri encrypted edildiği için bu ifade kullanılır. Bu senaryoda bu değer **header** içerisinden alınacaktır.

<Warning>
  **Clear Authentication Information** seçeneği seçilirse gelen mesaj içerisinde authentication bilgisi silinir. 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 istemciye ait bilgilerin bulunup bulunmayacağını belirtir.
* Bu seçenek aktif duruma gelirse **Authenticated User Header Name** isminde başka bir parametre ortaya çıkmaktadır.
* Burada yer alan **X-Authenticated-UserId** ifadesi ise backend API'ye gidecek olan istemci bilgisinin hangi başlık ismi ile gideceğini belirtmektedir.

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

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

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

<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}"** endpoint'i 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 istenilen **petId** değeri **"2"** olarak girilir, **Send** butonuna basıldığında dönen yanıtın bir hata mesajı olduğu görülmektedir.

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

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

Bu proxy'de **Basic (Base64) Authentication** kullanıldığı için **username** ve **password** bilgilerinin de bu yönde **encrypted** edilmesi gereklidir.

## Base64 Türünde Şifrelemenin Yapılması

**Test** menüsü altında yer alan **Toolbox** menüsü seçilir, burada **Base64** şifreleme formatında **encode** ve **decode** yapabilecek bir araç bulunmaktadır. Bu araç seçilir.

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

**decoded data** alanına şifrelenmesini istediğiniz ifadeler yazılır, **encoded data** alanında ise şifrelenen veri elde edilir.

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

**Encode** edilmiş hali olan **username** ve **password** bilgisi buradan elde edilir ve tekrardan **proxy'lerin** listelendiği sayfaya gidilir.

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

**Develop** sekmesine geçiş yapılır burada listelenmekte olan endpoint'lerden **"/pet/{petId}"** endpoint'i seçilir ve **Test Endpoint** denir.

URL'de istenilen **petId** değeri yine **"2"** olarak verilir.

**Headers** içerisinde **Authorization** ifadesini ve buna da değer olarak **encoded edilen username ve password** bilgisi **Base64** formatında girilir.

**Send** butonuna tıklanarak belirtilen **id'ye** göre veri getirme işlemi gerçekleştirilir.

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